大家都知道Android6.0以后权限都要动态申请,涉及到读写操作的时候,首先需要在AndroidManifest.xml文件中添加
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
然后在代码中要动态申请权限
private String[] PERMISSIONS = {Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
private final int PERMISSION_CODE = 1000;
//...
requestPermissions(PERMISSIONS, PERMISSION_CODE);
//权限获取之后的操作。。。不具体写了,网上很多代码
然后开始读写本地文件都没问题,但是读写U盘就报错java.io.IOException:permission denied
在网上各种找解决办法,终于,终于,让我解决了这个报错问题,哈哈哈哈
在AndroidManifest.xml文件中再加一个权限
<uses-permission
android:name="android.permission.WRITE_MEDIA_STORAGE"
tools:ignore="ProtectedPermissions" />
就是这个权限,加上就不在报权限被拒的异常啦啦啦
然后就按照buffer方式复制文件,会出现另一个问题,就是复制成功之后,立即拔出U盘,文件为0kb。这个问题也需要解决,方式就是在fileOutputStream.write()之后调用fileOutputStream.getFD().sync()方法
//....
FileInputStream fileInputStream = new FileInputStream(oldPathName);
FileOutputStream fileOutputStream = new FileOutputStream(newPathName);
byte[] buffer = new byte[1024];
int byteRead;
while (-1 != (byteRead = fileInputStream.read(buffer))) {
fileOutputStream.write(buffer, 0, byteRead);
}
fileOutputStream.getFD().sync();
fileInputStream.close();
fileOutputStream.flush();
fileOutputStream.close();
//...