android內置存儲卡和外部存儲卡的判斷


 

Environment.getDataDirectory() = /data
Environment.getDownloadCacheDirectory() = /cache
Environment.getExternalStorageDirectory() = /mnt/sdcard
Environment.getRootDirectory() = /system
context.getCacheDir() = /data/data/com.mt.mtpp/cache
context.getExternalCacheDir() = /mnt/sdcard/Android/data/com.mt.mtpp/cache
context.getFilesDir() = /data/data/com.mt.mtpp/files

android系統自從升級到2.3以后,多一個功能,可以判斷存儲卡是否是可以卸載的。Environment.isExternalStorageRemovable(),通過此方法我們可以知道手機上的存儲卡是手機自帶的還是外邊可插拔的SD卡,當然此種情況是指只有一個卡的情況。
但是現在國內的大多數手機都支持雙存儲卡:
1、即手機內置的有2G、4G或8G的內部存儲卡,默認安裝的應用與數據都會到這個卡中,用戶不買可插拔的SD卡,也可使用。
2、手機的存儲空間畢竟有限,所以手機也支持外置的SD卡,或者叫TF卡、擴展卡等。
那么這時候問題就來了,在程序中我們如何可以判斷哪個路徑對應的是內置存儲卡,哪個對應的是外置存儲卡。有人說用Environment.getExternalStorageDirectory()方法得到不就是SD卡嗎,這種方法明顯不適用的,尤其在4.0以后。
恰恰相反,使用上面的方法得到的大多數是手機內部對應的SD卡(/mnt/sdcard 4.1系統以下,4.1直接變為/storage/sdcard0),下面我總結了一些較常見的外部SD卡的路徑:
/mnt/sdcard2                 /mnt/sdcard-ext     /mnt/ext_sdcard    /mnt/sdcard/SD_CARD
/mnt/sdcard/extra_sd   /mnt/extrasd_bind   /mnt/sdcard/ext_sd
/mnt/sdcard/external_SD    /storage/sdcard1   /storage/extSdCard 
如何直接取,而不是hardcode來定死呢,用這個方法getVolumePaths,通過反射機制得到路徑,然后判斷即可。

代碼如下:

package com.example.secsdcard;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.os.storage.StorageManager;

public class StorageList {

private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;

public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
.getSystemService(Activity.STORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManager.getClass()
.getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}

public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return paths;
}
}

然后Activity通過調用

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
list = new StorageList(this);
TextView textView = new TextView(this);

if (list.getVolumePaths()[0].equals(Environment.MEDIA_MOUNTED)) {
textView.setText("有外部存儲卡"+list.getVolumePaths()[0]);
} else {
textView.setText("有外部存儲卡"+list.getVolumePaths()[1]);
}

// textView.setText(list.getVolumePaths()[0].toString()+list.getVolumePaths()[1].toString());
textView.setTextSize(50);
setContentView(textView);

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM