博客列表 >获取U盘的挂载路径,直接读写U盘(就像挂载sdcard读写文件)

获取U盘的挂载路径,直接读写U盘(就像挂载sdcard读写文件)

弘德誉曦的博客
弘德誉曦的博客原创
2019年10月19日 20:50:402307浏览

对于U盘的文件系统,只依赖于手机系统是否支持,无需我们做额外工作(所有Android手机都支持FAT32,有个别手机还支持NTFS) 但是有些手机无法获取挂载路径(如小米等,就算通过mount命令找到挂载路径也没有权限读写),所以该方法通用性其实不如方法一!

1.通过MEDIA广播获取挂载路径

// 注册系统广播
<receiver android:name=".MediaReceiver">
	<intent-filter>
		<action android:name="android.intent.action.MEDIA_CHECKING" />
		<action android:name="android.intent.action.MEDIA_MOUNTED" />
		<action android:name="android.intent.action.MEDIA_EJECT" />
		<action android:name="android.intent.action.MEDIA_UNMOUNTED" />

		<data android:scheme="file" />
	</intent-filter>
</receiver>

// 获取USB挂载路径
public class MediaReceiver extends BroadcastReceiver {		
	@Override
	public void onReceive(Context context, Intent intent) {
		switch (intent.getAction()) {
			case Intent.ACTION_MEDIA_CHECKING:
				break;
			case Intent.ACTION_MEDIA_MOUNTED:
				// 获取挂载路径, 读取U盘文件
				Uri uri = intent.getData();
				if (uri != null) {
					String filePath = uri.getPath();
					File rootFile = new File(filePath);
					for (File file : rootFile.listFiles()) {
						// 文件列表...
					}
				}
				break;
			case Intent.ACTION_MEDIA_EJECT:
				break;
			case Intent.ACTION_MEDIA_UNMOUNTED:
				break;
		}
	}
}

2.通过反射系统方法获取挂载路径

public static List<String> getUsbPaths(Context cxt) {
	List<String> usbPaths = new ArrayList<>();
	try {
		StorageManager srgMgr = (StorageManager) cxt.getSystemService(Context.STORAGE_SERVICE);
		Class<StorageManager> srgMgrClass = StorageManager.class;
		String[] paths = (String[]) srgMgrClass.getMethod("getVolumePaths").invoke(srgMgr);
		for (String path : paths) {
			Object volumeState = srgMgrClass.getMethod("getVolumeState", String.class).invoke(srgMgr, path);
			if (!path.contains("emulated") && Environment.MEDIA_MOUNTED.equals(volumeState))
				usbPaths.add(path);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return usbPaths;
}


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议