web-dev-qa-db-ja.com

AndroidでSDカードにファイルを書き込もうとすると、FileNotFoundException(許可が拒否されました)

タイトルからわかるように、Androidのsdcardにファイルを書き込む際に問題があります。 この質問 を確認しましたが、助けにはなりませんでした。他のアプリが読めるように、SDカードの公共スペースにあるファイルを書きたいです。

まず、SDカードがマウントされているかどうかを確認します。

Environment.getExternalStorageState();

次に、このコードを実行します。

File baseDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    baseDir.mkdirs();
    File file = new File(baseDir, "file.txt");
    try {
        FileOutputStream out = new FileOutputStream(file);
        out.flush();
        out.close();
        Log.d("NEWFILE", file.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

私が持っています:

<manifest>
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

<application>
...
</application>
</manifest>

私のAndroidManifest.xmlで。

正確なエラーは次のとおりです。

Java.io.FileNotFoundException: /storage/1510-2908/Download/secondFile.txt: open failed: EACCES (Permission denied)

エミュレータでコードをテストしています(Nexus5 API 23をエミュレートしています)。最低限必要なSDKバージョンは19(4.4 KitKat)です。


また、同じコードでSDカードのプライベートフォルダにファイルを書き込むことですべてが正常に動作するため、以前のコードも動作するはずです:

File newFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "esrxdtcfvzguhbjnk.txt");
    newFile.getParentFile().mkdirs();
    try {
        FileOutputStream out = new FileOutputStream(newFile);
        out.flush();
        out.close();
        Log.d("NEWFILE", newFile.getAbsolutePath());
    } catch (IOException e) {
        e.printStackTrace();
    }

誰が問題になる可能性のある手がかりを持っていますか?どういうわけかキットカット4.4は、もはやSDカードの公共スペースへの書き込みを許可しないのでしょうか?

16
Drag0
  1. SDカードのプライベートフォルダにファイルを書き込むことですべてがうまく機能します

Android 4.4から始まります。アプリ専用のファイルのみを読み書きする場合、これらの権限は不要です。詳細については、 app- private。

  1. AndroidでSDカードにファイルを書き込もうとするとFileNotFoundException(許可が拒否されました)

API 23(Marshmallow)を使用してエミュレーターでファイルを書き込もうとしているので、WRITE_EXTERNAL_STORAGE実行時の許可も。詳細については、 this および this を確認してください。

24
Dhaval Patel