我正在尝试编写一个Android应用程序,该应用程序除其他外需要读取文件并将其写入“外部”存储。
虽然我能够浏览并选择外部存储上的文件夹,但是每次尝试访问该文件时,都会出现“权限被拒绝的I / O”异常。
我已在我的应用清单中包含以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
我还为Android中的应用启用了STORAGE权限。
我正在使用Chromebook进行开发,因此无法访问模拟器。因此,我通过USB-C电缆在手机(Pixel 3)上测试和调试了我的应用。我还可以生成一个APK并将其侧面加载到我的Chromebook上,但是我无法通过这种方式进行调试。
以下代码示例是我从Internet上收集的。
public void writeFileExternalStorage(View view) {
String cashback = "Get 2% cashback on all purchases from xyz \n Get 10% cashback on travel from dhhs shop";
String state = Environment.getExternalStorageState();
//external storage availability check
if (!Environment.MEDIA_MOUNTED.equals(state)) {
return;
}
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOCUMENTS), filenameExternal);
FileOutputStream outputStream = null;
try {
file.createNewFile();
//second argument of FileOutputStream constructor indicates whether to append or create new file if one exists
outputStream = new FileOutputStream(file, true);
outputStream.write(cashback.getBytes());
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
当执行file.createNewFile()时,将引发以下异常:java.io.IOException:权限被拒绝
在这个问题上,我已经将头撞墙了两天了,这没有任何好处。我希望这里有人可以帮忙,因为我的头真的很痛! :-)
答案 0 :(得分:2)
显然,应该归咎于Android 10。
我将Target SDK降低到28(Android 9),并且代码可以正常工作。
如果我想让它在Android 10上正常运行,则必须使用MediaStore for SDK 29 +。
答案 1 :(得分:0)
您必须在writeFileExternalStorage
函数之前检查运行时权限:
private static final int WRITE_EXTERNAL_STORAGE = 0;
private static final int REQUEST_PERMISSION = 0;
int permissionCheckStorage = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permissionCheckStorage != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_PERMISSION);
return;
}