在我的启动画面中,我想检查手机是否有SD卡。布尔语句位于:
之下 Boolean isSDPresent = android.os.Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED );
所以,如果我的手机插槽中有SDCard,这个布尔值将返回true,到目前为止一直很好。当我从设置菜单转到“Unmount SDCard”并移除SDCard,然后杀死应用程序并再次启动它时,布尔值也将为真..
如果我在卸载并移除SD卡后启动Astro File Manager
,我仍然可以访问/mnt/sdcard
路径,为什么?
我怎样才能成功实现这一目标?
提前致谢!
修改
使用以下代码进行测试:
File path = Environment.getExternalStorageDirectory();
String pathS = path.getPath();
当SDCard位于广告位中时,pathS
包含mnt/sdcard
,但当我删除SD卡时,pathS
仍为/mnt/sdcard
...
答案 0 :(得分:12)
我发现手机,如三星的Galaxy手机,/mnt/sdcard
指向内部存储器,而不是预期的外部SD卡。
您可以知道Environment.getExternalStorageDirectory()返回的路径是否实际上是外部SD卡,并且呼叫Environment.isExternalStorageRemovable()
只是想从getExternalStorageDirectory()的文档中添加这个重要的注释:
注意:不要在这里混淆“外部”这个词。这个目录 可以更好地被视为媒体/共享存储。它是一个文件系统 可以容纳相对大量的数据,并且可以共享 所有应用程序(不强制执行权限)。传统上这是 SD卡,但它也可以作为内置存储器实现 与受保护的内部存储区别的设备,可以是 作为文件系统安装在计算机上。
答案 1 :(得分:2)
不应该是:
boolean isPresent = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED
);
正如Environment.getExternalStorageState()
的文档说明:
获取主要“外部”存储设备的当前状态。
对于Environment.MEDIA_MOUNTED
-constant:
如果媒体是,则
getExternalStorageState()
会返回MEDIA_MOUNTED
存在并安装在其挂载点,具有读/写访问权限。
这将从API Level 1 +
开始答案 2 :(得分:2)
我修改了如果存在SD卡,则在那里设置路径 如果没有将它设置在内部目录
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent)
{
path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder";
}
else
{
path = theAct.getFilesDir() + "/GrammarFolder";
}
答案 3 :(得分:1)
如果你想显示是否插入了sdcard,那么只需复制粘贴此代码即可为所有设备100%工作,代码在此处:
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();
}
答案 4 :(得分:1)
我们有两个记忆状态。一个是内部存储卡,另一个是外部SD卡。这取决于设备制造商如何制造存储卡路径。因此,如果您正在检查SD卡可用性,那么由于内部存储器的原因,它可能在两种情况下都返回true。所以选择这种方法:
File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null);
if(listOfInternalAndExternalStorage.length>=2){
// it contains sd card
}
上面的代码将检查listOfInternalAndExternalStorage是否多于一个,然后它有外部存储,否则它不包含SD卡。
答案 5 :(得分:0)
//如果你想保存外部的话,试试这个......
public String preferextstorage(Context con){
int version = Build.VERSION.SDK_INT;
String result=con.getFilesDir().getPath();
if (version>=19) {
File[] listOfInternalAndExternalStorage = con.getExternalFilesDirs(null);
if (listOfInternalAndExternalStorage.length >= 2) {
// it contains sd card
if (listOfInternalAndExternalStorage[1]==null){
result=listOfInternalAndExternalStorage[0].getPath();
}else
{
result=listOfInternalAndExternalStorage[1].getPath();
}
return result;
}
}
return result;
}
答案 6 :(得分:-2)
此代码段可能会用于检测和处理Samsung设备的例外情况:
public static String getExternalStorage() {
String str = Environment.getExternalStorageDirectory().getAbsolutePath();
if ( isSamsungDevice() ) {
if ( isSamsungExternalSDMounted() ) {
str += "/external_sd";
}
}
return str;
}
private static boolean isSamsungDevice() {
return new File( Environment.getExternalStorageDirectory().getAbsolutePath() + "/external_sd" ).exists();
}
private static boolean isSamsungExternalSDMounted() {
return exec( "mount" ).indexOf( "external_sd" ) >= 0;
}
public static String exec( String paramString ) {
try {
String str = "";
InputStream localInputStream = Runtime.getRuntime().exec( paramString ).getInputStream();
byte[] arrayOfByte = new byte[1024];
StringBuilder localStringBuilder = new StringBuilder();
while ( true ) {
int i = localInputStream.read( arrayOfByte, 0, arrayOfByte.length );
if ( i == -1 ) {
str = localStringBuilder.toString();
break;
}
localStringBuilder.append( new String( arrayOfByte, 0, i ) );
}
return str;
} catch ( IOException e ) {
e.printStackTrace();
return null;
}
}