赞
踩
**
以下所有操作的前提是: android 系统已经root
**
最近在将文件拷贝到U盘时总是 写入失败(Permission denied)
程序清单中已经加入了权限
并且动态申请了权限
private static String[] PERMISSIONS_REQ = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private static final int REQUEST_CODE_PERMISSION = 1;
int write_permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int read_permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if ( write_permission != PackageManager.PERMISSION_GRANTED ||
read_permission != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_REQ, REQUEST_CODE_PERMISSION);
}
有人说要修改 system\etc\permissions\platform.xml (安装RE文件管理器,即可修改(必须root))中的
修改为
重启之后还是报错
在纠结之后 …
最后发现 程序识别到的U盘目录是 /storage/28BA-794A (28BA-794A 是我的U盘名字)
但是系统中还有一个相同名字的U盘 那就是/mnt/media_rw/28BA-794A
修改目录为/mnt/media_rw/ 后,文件成功写入到U盘中
下面提供一种查找 /mnt/media_rw/ 目录下U盘的方式
try{
StorageManager storageManager = (StorageManager) m_context.getSystemService(Context.STORAGE_SERVICE);
Class storeManagerClazz = Class.forName("android.os.storage.StorageManager");
Method getVolumesMethod = storeManagerClazz.getMethod("getVolumes");
List> volumeInfos = (List>)getVolumesMethod.invoke(storageManager);
Class volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo");
Field udiskPath = volumeInfoClazz.getDeclaredField("internalPath");
Method getFsUuidMethod = volumeInfoClazz.getMethod("getFsUuid");
if(volumeInfos != null){
for(Object volumeInfo:volumeInfos){
String uuid = (String)getFsUuidMethod.invoke(volumeInfo);
if(uuid != null){
String sUdiskPath = (String)udiskPath.get(volumeInfo); // 结果是 /mnt/media_rw/28BA-794A
return sUdiskPath;
}
}
}
}catch(Exception e){
Log.e(TAG," check udisk error = " + e.getMessage());
}
最后,通过反复验证
要操作U盘等外设
系统要具有root权限
修改system\etc\permissions\platform.xml
为
修改之后需要重启系统
就是操作的目录要正确
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。