[英]Why can't I write to Android External Storage?
我正在尝试编写一个 Android 应用程序,除其他外,它需要读取和写入文件到“外部”存储。
虽然我能够浏览和选择外部存储上的文件夹,但每次尝试访问该文件时,我都会收到 Permission denied 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: Permission denied
我已经在这个问题上撞墙两天了,但没有任何好处。 我希望这里有人可以提供帮助,因为我的头真的很痛! :-)
显然,Android 10 是罪魁祸首。
我将目标 SDK 降低到 28(Android 9)并且代码有效。
看起来如果我希望它适用于 Android 10,我将不得不将 MediaStore 用于 SDK 29+。
您必须在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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.