1

我正在尝试在应用程序外部的文件夹中的外部存储中写入文件。我在清单中添加了 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>

4

3 回答 3

3

对于 Android >=6.0 的设备,您必须在运行时请求权限

对于 android 4,apprently 添加android:maxSdkVersion="18"生成此异常,尝试删除它

编辑:对于 Android 4.4 及更高版本,如果您只想从文档写入外部存储,则不要 WRITE_EXTERNAL_STORAGE

从 Android 4.4(API 级别 19)开始,当您的应用想要写入外部存储上自己的应用特定目录(由 getExternalFilesDir() 提供的目录)时,您的应用不再需要请求 WRITE_EXTERNAL_STORAGE 权限

Elsewere,对于 android < 4.4,您需要android:maxSdkVersion="18"在外部存储上添加自己的应用程序特定目录

于 2018-06-01T19:10:20.470 回答
0

最后昨天我发现了 CommonsWare 在评论中完美解释的同样的事情:

摆脱 android:maxSdkVersion="18"。这仅在您在 Context 上使用 getExternalFilesDir()、getExternalCacheDir() 和类似方法时才有效。您正在使用 Environment.getExternalStorageDirectory(),因此您始终需要 WRITE_EXTERNAL_STORAGE

于 2018-06-02T09:35:32.237 回答
0

只需尝试使用此代码请求许可:

private void requestPermission() {
    ActivityCompat.requestPermissions(getActivity() ,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE ,
                    Manifest.permission.READ_EXTERNAL_STORAGE} ,
            PERMISSION_READ_WRITE_REQUEST_CODE);
}

PERMISSION_READ_WRITE_REQUEST_CODE是自定义变量,以我的方式是 34。

并处理它

 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode){
        case PERMISSION_READ_WRITE_REQUEST_CODE : {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                  //yeee permission granted
            }
        }
    }
}
于 2018-06-02T06:06:03.343 回答