Android 确定SD卡是否存在的可靠方法
Android 确定SD卡是否存在的可靠方法,android,android-sdcard,android-external-storage,Android,Android Sdcard,Android External Storage,我的问题早些时候也被问到了&因为没有令人满意的答案,我被卡住了。我的要求很简单。我正在开发一个应用程序,需要让用户选择一个存储来保存应用程序内下载。我需要一种方法来确认是否存在外部SD卡。已经尝试了以下方法: 这总是返回真值,可能是由于以下原因: 以下操作也不起作用,因为不同手机的硬编码路径可能不同 File file = new File("/mnt/extSdCard"); try { File list[] = file.listFiles(); T
我的问题早些时候也被问到了&因为没有令人满意的答案,我被卡住了。我的要求很简单。
我正在开发一个应用程序,需要让用户选择一个存储来保存应用程序内下载。我需要一种方法来确认是否存在外部SD卡。
已经尝试了以下方法:
这总是返回真值,可能是由于以下原因:
以下操作也不起作用,因为不同手机的硬编码路径可能不同
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不公开任何允许您获取SD卡根路径的API。您可以使用反射并从StorageManager.java->GetVolumePath()获取SD卡根路径
您不能任意保存到SD卡上的任何位置。您可以使用从getExternalFilesDirs返回的路径之一,也可以使用SAF(存储访问框架)显式请求用户对SD卡的写入权限 Android不公开任何允许您获取SD卡根路径的API。您可以使用反射并从StorageManager.java->GetVolumePath()获取SD卡根路径 您不能任意保存到SD卡上的任何位置。您可以使用从getExternalFilesDirs返回的路径之一,也可以使用SAF(存储访问框架)显式请求用户对SD卡的写入权限 你应该使用这个方法。此方法返回内存和Micro SD卡(如果存在)的路径。第二个返回路径是Micro SD卡的路径。但该路径可能不是Micro SD卡的根目录 API级别19中引入的
getExternalFilesDirs
是唯一可用于获取SD卡路径的官方方法。所有其他方法将返回内存的公共或私有存储位置(路径)
我已经在我的手机和模拟器上测试了这个方法。请注意,在测试期间,我已将null
作为getExternalFilesDirs
的参数传递。但您也可以传递参数,如Environment.DIRECTORY\u PICTURES
,Environment.DIRECTORY\u MOVIES
等
测试结果:-
当我的手机插入存储卡时,getExternalFilesDirs
返回:
第一条路径(内部内存):/storage/simulated/0/Android/data/my_package.appname/files
第二路径(Micro SD):/storage/sdcard1/Android/data/my_package.appname/files
注意:我的SD卡的根目录是:/storage/sdcard1
在我的模拟器上,getExternalFilesDirs
返回:
第一条路径(内部内存):/storage/simulated/0/Android/data/my_package.appname/files
第二路径(Micro SD):/storage/11E9-4214/Android/data/my_package.appname/files
注意:在emulator上,SD卡是模拟的(不是真实的)
如果Micro SD卡被弹出(在手机或模拟器上)getExternalFilesDirs
返回null
第一条路径(内存):内存路径-根据设备的不同而有所不同
第二路径(Micro SD):null
但是强>
在某些设备上,可能无法获取Micro-SD卡路径。这意味着getExternalFilesDirs
将只返回一条路径(内存)。第二条路径将为空,即它不会返回任何第二条路径
原因:该特定设备的OEM可能未在设备中设置路径(即辅助存储
环境变量)
比如说
OEM必须已在中设置辅助存储环境变量
此处提到的特定于设备的init.rc
文件:
还有somesh对上述的评论说
如果未设置该环境变量,则无法写入SD卡
使用getExternalFilesDirs
,因为它不会返回
SD卡路径
在这种情况下,假设存储卡不存在,并将您想要保存的内容保存到内存中
总结一下,如果getExternalFilesDirs
没有返回第二条路径或者返回的第二条路径为null
,则不要存储在SD卡中(存储在内部存储器中);else存储在由getExternalFilesDirs
建议:
要了解Android中的不同存储位置,请浏览您应该使用的方法。此方法返回内存和Micro SD卡(如果存在)的路径。第二个返回路径是Micro SD卡的路径。但该路径可能不是Micro SD卡的根目录
API级别19中引入的getExternalFilesDirs
是唯一可用于获取SD卡路径的官方方法。所有其他方法将返回内存的公共或私有存储位置(路径)
我已经在我的手机和模拟器上测试了这个方法。请注意,在测试期间,我已将null
作为getExternalFilesDirs
的参数传递。但您也可以传递参数,如Environment.DIRECTORY\u PICTURES
,Environment.DIRECTORY\u MOVIES
等
测试结果:-
当我的手机插入存储卡时,getExternalFilesDirs
返回:
第一条路径(内部内存):/storage/simulated/0/Android/data/my_package.appname/files
第二路径(Micro SD):/storage/sdcard1/Android/data/my_package.appname/files
注意:我的SD卡的根目录是:/storage/sdcard1
在我的emula上
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();
}