一些问题(2)

关于监听盒子的外部存储器(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;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值