我正在尝试在应用程序外部的文件夹中,在外部存储中写入文件。我在清单中添加了WRITE_EXTERNAL_STORAGE权限。
stackoverflow中有类似的错误,但在尝试解决方案后(正如您将在下一行中看到的)我遇到了同样的错误。
我在使用Nexus 5X api 27 oreo rom的模拟器和使用Android 4.4的华为真实手机中试用了它
在两台设备中我都遇到了同样的错误:
FileNotFoundException: /storage/sdcard0/Myfile.txt: open failed: EACCES (Permission denied)
这是我的代码:
String content = "hello world";
File file;
FileOutputStream outputStream;
try {
file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "MyFile.txt");
outputStream = new FileOutputStream(file);
outputStream.write(content.getBytes());
outputStream.close();
} catch (IOException e) {
Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myapp">
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-feature
android:name="android.hardware.location"
android:required="false" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activities.Activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
答案 0 :(得分:3)
对于Android&gt; = 6.0的设备,您必须request permissions at runtime
对于android 4,显然添加android:maxSdkVersion="18"
生成此异常,请尝试删除它
编辑:对于Android 4.4及更高版本,您不要在doc:
中写入要写入外部存储的WRITE_EXTERNAL_STORAGE 仅限从Android 4.4(API级别19)开始,不再需要它 为您的应用程序请求WRITE_EXTERNAL_STORAGE权限时 您的应用程序想要写入自己的应用程序特定目录 外部存储(由getExternalFilesDir()提供的目录)
Elsewere,for android&lt; 4.4,您需要为自己的应用程序特定目录添加android:maxSdkVersion="18"
外部存储
答案 1 :(得分:0)
最后昨天我发现CommonsWare在评论中完全解释了同样的事情:
摆脱android:maxSdkVersion =“18”。只有你这样才有效 使用getExternalFilesDir(),getExternalCacheDir()等 关于Context的方法。您正在使用 Environment.getExternalStorageDirectory(),所以你总是需要 WRITE_EXTERNAL_STORAGE