关于监听盒子的外部存储器(USB,sdcard等)
一种很常见的方法是注册监听广播ACTION_MEDIA_MOUNTED、ACTION_MEDIA_UNMOUNTED和ACTION_MEDIA_REMOVED,来判断外部存储器的挂载和卸载,但是当有两个USB接口时,其中一个接入,另一个接入后拔出,就有可能有问题,还有一个问题,当重新启动应用时无法判断usb是否已接入,因为不是粘性广播。
解决方法一:反射,同时配合监听广播
public static boolean isHasStorageMounted(Context context) {
StorageManager sm = (StorageManager) context
.getSystemService(Context.STORAGE_SERVICE);
String[] paths = null;
String sdcardPath = null;
try {
// 获取所有外设的路径
Method mMethodGetPaths = sm.getClass().getMethod("getVolumePaths");
paths = (String[]) mMethodGetPaths.invoke(sm);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
if (paths != null) {
sdcardPath = Environment.getExternalStorageDirectory() != null ? Environment
.getExternalStorageDirectory().getPath() : null;
for (String path : paths) {
try {
// 获取外设的挂载状态
Method mMethodGetState = sm.getClass().getMethod(
"getVolumeState", String.class);
String state = (String) mMethodGetState.invoke(sm, path);
// 排除掉sdcard
if (Environment.MEDIA_MOUNTED.equals(state)
&& !path.equals(sdcardPath)) {
return true;
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
return false;
}
解决方法二:使用隐藏的api,配合监听广播,当然要源码编译的classes.jar包
public static boolean isHasStorageMounted(Context context) {
StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);
if(sm == null) {
return false;
}
String[] paths = sm.getVolumePaths();
if(paths != null) {
for(String path : paths) {
// sdcard
if("/storage/emulated/0".equals(path)) {
continue;
}
String state = sm.getVolumeState(path);
if("mounted".equals(state)) {
return true;
}
}
}
return false;
}