直接上重點(diǎn):
1:獲取內(nèi)置SD卡的路徑, 但是判斷是否有效(是否掛載), 需要用到下面檢測掛載點(diǎn)的方法
/**
* 獲取內(nèi)置SD卡路徑
*
* @return
*/
public String getInnerSDCardPath() {
return Environment.getExternalStorageDirectory().getPath();
}
2:枚舉系統(tǒng)所有可用的掛載點(diǎn),返回的都是絕對(duì)路徑
/** 枚舉所有掛載點(diǎn) */
public static String[] getVolumePaths(Context context) {
String[] paths = null;
StorageManager mStorageManager;
Method mMethodGetPaths = null;
try {
mStorageManager = (StorageManager) context
.getSystemService(Activity.STORAGE_SERVICE);
mMethodGetPaths = mStorageManager.getClass().getMethod(
"getVolumePaths");
paths = (String[]) mMethodGetPaths.invoke(mStorageManager);
} catch (Exception e) {
e.printStackTrace();
}
return paths;
}
我的運(yùn)行結(jié)果如下:
這里寫圖片描述
(圖中中文是檢測掛載的方法log輸出)
3:檢測掛載點(diǎn)是否可用
/**
* 檢查是否掛載
*/
public static boolean checkMounted(Context context, String mountPoint) {
if (mountPoint == null) {
return false;
}
StorageManager storageManager = (StorageManager) context
.getSystemService(Context.STORAGE_SERVICE);
try {
Method getVolumeState = storageManager.getClass().getMethod(
"getVolumeState", String.class);
String state = (String) getVolumeState.invoke(storageManager,
mountPoint);
return Environment.MEDIA_MOUNTED.equals(state);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
(截圖如上,如果已掛載,返回true)
SD卡廣播:
//在AndroidManifest.xml文件中,聲明廣播
<receiver android:name=".SDBroadCastReceiver" ><!--聲明廣播接收器-->
<intent-filter android:priority="1000" ><!--接收廣播的優(yōu)先級(jí),數(shù)值越大優(yōu)先級(jí)越高,最大1000,目的:防止被其他程序攔截此廣播-->
<action android:name="android.intent.action.MEDIA_MOUNTED" /><!--接收已掛載廣播-->
<action android:name="android.intent.action.MEDIA_EJECT" /><!--接收拔插廣播-->
<data android:scheme="file" /><!--指定過濾資源類型-->
</intent-filter>
</receiver>
public class SDBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
Log.e(context.getClass().getSimpleName(), "SD卡已拔出");
} else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
Log.e(context.getClass().getSimpleName(), "SD卡掛載");
}
}
}
補(bǔ)充說明, 這里測試環(huán)境是Android 4.2.2, API 17
/mnt/sdcard :這是內(nèi)置SD卡的路徑(也是掛載點(diǎn));(不同Android版本,可能不一樣)
/mnt/extsd :這是外置SD卡的路徑(也是掛載點(diǎn));
所以:
如果要檢測內(nèi)置/外置SD卡是否存在(可用),方法如下:
if (checkMounted(MainActivity.this, "/mnt/sdcard")) {
Log.e(this.getLocalClassName(), "內(nèi)置SD卡可用");
}
if (checkMounted(MainActivity.this, "/mnt/extsd")) {
Log.e(this.getLocalClassName(), "外置SD卡可用");
}
簡單介紹 Java反射的用法:
1:獲取需要反射的對(duì)象(需要修改屬性,或者需要調(diào)用非公隱藏方法的對(duì)象):
StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
2:得到對(duì)象需要調(diào)用的方法或者字段的名稱
//得到 方法名稱,這個(gè)方法必須是public聲明的才能獲取,如果要獲取非公方法名,需要使用getDeclaredMethods方法
Method getVolumeState = storageManager.getClass().getMethod("getVolumeState", String.class);//第一個(gè)參數(shù):方法的名稱, 第二個(gè)參數(shù):方法的參數(shù)
//得到 字段名,這里用了getDeclaredField方法,所以可以得到非公聲明的字段
Field tag = storageManager.getClass().getDeclaredField("TAG");
tag.setAccessible(true);//因?yàn)榭赡茏侄问欠枪?所以需要設(shè)置訪問權(quán)限為公有
tag.set(storageManager, "New Tag");//修改字段的值
3:調(diào)用方法(字段賦值,前面已經(jīng)說了)
String state = (String) getVolumeState.invoke(storageManager,mountPoint);
//storageManager :是需要修改的對(duì)象
//mountPoint :方法需要的參數(shù)
至此: 文章就結(jié)束了,如有疑問: QQ群:274306954 歡迎您的加入.