簡體   English   中英

FileNotFoundException:/storage/sdcard0/Myfile.txt:open failed:EACCES(Permission denied)

[英]FileNotFoundException: /storage/sdcard0/Myfile.txt: open failed: EACCES (Permission denied)

我正在嘗試在應用程序外部的文件夾中,在外部存儲中寫入文件。 我在清單中添加了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>

對於Android> = 6.0的設備,您必須在運行時請求權限

對於android 4,顯然添加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"

只需嘗試使用此代碼請求權限:

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
            }
        }
    }
}

昨天終於發現CommonsWare在評論中完全解釋了同樣的事情:

擺脫android:maxSdkVersion =“18”。 只有在Context上使用getExternalFilesDir(),getExternalCacheDir()和類似方法時,這才有效。 您正在使用Environment.getExternalStorageDirectory(),因此您始終需要WRITE_EXTERNAL_STORAGE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM