确定 SDCard 是否存在的确定方法
A sure shot method to find if SDCard is present
Android check for SD Card mounted always returns true
之前也有人问过我的问题,由于没有令人满意的答案,我被困住了。我的要求非常简单。
我正在开发一个应用程序,我需要要求用户 select 一个存储空间以保存在应用程序下载中。我需要一种确认外部 SD 卡存在的方法。
已经尝试过以下方法:
这总是返回 true 可能是由于以下原因:
final Boolean isSDPresent = Environment.getExternalStorageState().
equals(android.os.Environment.MEDIA_MOUNTED);
以下也不起作用,因为不同手机的硬编码路径可能不同
File file = new File("/mnt/extSdCard");
try {
File list[] = file.listFiles();
Toast.makeText(getApplicationContext(),
"Yes sdcard is mounted,file count " + list.length,
Toast.LENGTH_LONG).show();
} catch (NullPointerException o) {
Toast.makeText(getApplicationContext(),
"Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show();
}
如有任何建议,我们将不胜感激!
Android 不会公开任何允许您获取 sdcard 根路径的路径的 API。您可以使用反射并从 StorageManager.java -> getVolumePaths() - http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/os/storage/StorageManager.java#590
获取 sdcard 根路径
不能随意保存到SD卡的任意位置。您可以使用从 getExternalFilesDirs 返回的路径之一或使用 SAF(存储访问框架)明确请求用户权限写入 SD 卡。 How to use the new SD card access API presented for Android 5.0 (Lollipop)?
你应该使用getExternalFilesDirs方法。此方法 returns 到内部存储器和 Micro SD 卡(如果存在)的路径。第二个 returned 路径是 Micro SD 卡的路径。但该路径可能不是Micro SD卡的根目录。
getExternalFilesDirs
在API19级介绍的是唯一官方方法可以获取SD卡路径。所有其他方法将 return public 或内部存储器的私有存储位置(路径)。
我已经在我的 phone 和模拟器上测试了这个方法。请注意,我在测试期间已将 null
作为 getExternalFilesDirs
的参数传递。但您也可以传递参数,例如 Environment.DIRECTORY_PICTURES
、Environment.DIRECTORY_MOVIES
等
测试结果:-
当 我的 phone 插入存储卡时, getExternalFilesDirs
returned :
第一条路径(内存):/storage/emulated/0/Android/data/my_package.appname/files
第二条路径(Micro SD):/storage/sdcard1/Android/data/my_package.appname/files
注:我的SD卡根目录是:/storage/sdcard1
在我的模拟器上, getExternalFilesDirs
returned :
第一条路径(内存):/storage/emulated/0/Android/data/my_package.appname/files
第二条路径(Micro SD):/storage/11E9-4214/Android/data/my_package.appname/files
注意:在模拟器上,SD卡是模拟的(不是真实的)。
如果 Micro SD 卡弹出(在 phone 或模拟器上) getExternalFilesDirs
returns null
第一条路径(内存):path to internal memory - It varies depending on device
第二条路径(Micro SD):null
但是 ;
在某些设备上,您可能无法获取Micro SD卡路径。这意味着getExternalFilesDirs
将return只有一个路径(内存)。第二条路径将是空的,即它不会 return 任何第二条路径。
原因:该特定设备的 OEM 可能没有在设备中设置路径(即 SECONDARY_STORAGE
环境变量)。
for 说,
the OEM must have set the SECONDARY_STORAGE environment variable in
the device specific init.rc
file as mentioned here:
https://source.android.com/devices/storage/config-example.html
此外 somesh 对上述 的评论说,
If that environment variable is not set, you can't write to the sdcard
by making use of getExternalFilesDirs
since its not going to return
the sdcard path.
在这种情况下,假设存储卡不存在并在内部存储器中保存任何你想保存的内容。
总结,如果getExternalFilesDirs
没有return第二条路径或者return编辑的第二条路径是null
,不要存储在SD卡中(存储在内部存储器中);否则存储在第二条路径 returned by getExternalFilesDirs
建议:
要了解 Android 中的不同存储位置,请查看 my answer on Whosebug
Android check for SD Card mounted always returns true
之前也有人问过我的问题,由于没有令人满意的答案,我被困住了。我的要求非常简单。
我正在开发一个应用程序,我需要要求用户 select 一个存储空间以保存在应用程序下载中。我需要一种确认外部 SD 卡存在的方法。
已经尝试过以下方法:
这总是返回 true 可能是由于以下原因:
final Boolean isSDPresent = Environment.getExternalStorageState().
equals(android.os.Environment.MEDIA_MOUNTED);
以下也不起作用,因为不同手机的硬编码路径可能不同
File file = new File("/mnt/extSdCard");
try {
File list[] = file.listFiles();
Toast.makeText(getApplicationContext(),
"Yes sdcard is mounted,file count " + list.length,
Toast.LENGTH_LONG).show();
} catch (NullPointerException o) {
Toast.makeText(getApplicationContext(),
"Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show();
}
如有任何建议,我们将不胜感激!
Android 不会公开任何允许您获取 sdcard 根路径的路径的 API。您可以使用反射并从 StorageManager.java -> getVolumePaths() - http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/os/storage/StorageManager.java#590
获取 sdcard 根路径不能随意保存到SD卡的任意位置。您可以使用从 getExternalFilesDirs 返回的路径之一或使用 SAF(存储访问框架)明确请求用户权限写入 SD 卡。 How to use the new SD card access API presented for Android 5.0 (Lollipop)?
你应该使用getExternalFilesDirs方法。此方法 returns 到内部存储器和 Micro SD 卡(如果存在)的路径。第二个 returned 路径是 Micro SD 卡的路径。但该路径可能不是Micro SD卡的根目录。
getExternalFilesDirs
在API19级介绍的是唯一官方方法可以获取SD卡路径。所有其他方法将 return public 或内部存储器的私有存储位置(路径)。
我已经在我的 phone 和模拟器上测试了这个方法。请注意,我在测试期间已将 null
作为 getExternalFilesDirs
的参数传递。但您也可以传递参数,例如 Environment.DIRECTORY_PICTURES
、Environment.DIRECTORY_MOVIES
等
测试结果:-
当 我的 phone 插入存储卡时, getExternalFilesDirs
returned :
第一条路径(内存):/storage/emulated/0/Android/data/my_package.appname/files
第二条路径(Micro SD):/storage/sdcard1/Android/data/my_package.appname/files
注:我的SD卡根目录是:/storage/sdcard1
在我的模拟器上, getExternalFilesDirs
returned :
第一条路径(内存):/storage/emulated/0/Android/data/my_package.appname/files
第二条路径(Micro SD):/storage/11E9-4214/Android/data/my_package.appname/files
注意:在模拟器上,SD卡是模拟的(不是真实的)。
如果 Micro SD 卡弹出(在 phone 或模拟器上) getExternalFilesDirs
returns null
第一条路径(内存):path to internal memory - It varies depending on device
第二条路径(Micro SD):null
但是 ;
在某些设备上,您可能无法获取Micro SD卡路径。这意味着getExternalFilesDirs
将return只有一个路径(内存)。第二条路径将是空的,即它不会 return 任何第二条路径。
原因:该特定设备的 OEM 可能没有在设备中设置路径(即 SECONDARY_STORAGE
环境变量)。
the OEM must have set the SECONDARY_STORAGE environment variable in the device specific
init.rc
file as mentioned here: https://source.android.com/devices/storage/config-example.html
此外 somesh 对上述
If that environment variable is not set, you can't write to the sdcard by making use of
getExternalFilesDirs
since its not going to return the sdcard path.
在这种情况下,假设存储卡不存在并在内部存储器中保存任何你想保存的内容。
总结,如果getExternalFilesDirs
没有return第二条路径或者return编辑的第二条路径是null
,不要存储在SD卡中(存储在内部存储器中);否则存储在第二条路径 returned by getExternalFilesDirs
建议:
要了解 Android 中的不同存储位置,请查看 my answer on Whosebug