我正在尝试编写一个android应用程序,它需要将文件读写到“外部”存储中。
虽然我可以浏览和选择外部存储上的文件夹,但每次尝试访问该文件时,都会出现权限被拒绝的i/o异常。
我已在我的应用程序清单中包含以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
我还为android中的应用程序启用了存储权限。
我是在chromebook上开发的,所以我没有访问模拟器的权限。所以我在我的手机(像素3)上通过usb-c电缆测试和调试我的应用程序。我也可以生成一个apk并将其加载到chromebook上,但我不能用这种方式进行调试。
下面的代码示例是我从互联网上收集的。
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:权限被拒绝
在这个问题上,我已经头痛两天了,这对我没有任何好处。我希望这里有人能帮忙,因为我的头真的很痛!:-)
2条答案
按热度按时间mnemlml81#
显然,android 10是罪魁祸首。
我将目标sdk降低到28(Android9),代码正常。
如果我想让它在android10上运行,我就必须使用mediastoreforsdk29+。
n3h0vuf22#
您必须先检查运行时权限
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);