Android APIv29 FileNotFoundException EACCES(アクセスが拒否されました)


9

targetSdkVersion v29用にビルドするときにストレージにアクセスできません。

これが私のgradle設定です:

    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    ...
        minSdkVersion 15
        targetSdkVersion 29

WRITE_EXTERNAL_STORAGE許可が付与され、のビルド時に同じ設定が正常に機能することに注意してくださいtargetSdkVersion 28

これが私の実装です:

        val outputFolder = File(baseFolder + File.separator + "Output Folder")
        if (!outputFolder.exists()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Files.createDirectory(outputFolder.toPath()) //This allways returns false with targetSdkVersion 29
            } else {
                if (!outputFolder.mkdirs()) {
                    Log.e("SaveRaw", "Unable to create folder for audio recording")
                }
            }
        }

        outputFile = File("$baseFolder/Output Folder/$filename")
        try {
            fileOutputStream = FileOutputStream(outputFile)
        } catch (e: FileNotFoundException) {
            e.printStackTrace() // allways throwing exception here, even if Output Folder exists 
        }

そしてここが例外です:

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Chirp Auto Tester/2019_10_17 10:44:43.raw: open failed: EACCES (Permission denied)
W/System.err:     at libcore.io.IoBridge.open(IoBridge.java:496)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:186)

誰かが答えを持っているといいのですが、ここで何が欠けていますか?

更新:

ここbaseFolderから来ています。注getExternalStorageDirectory推奨されない方法です。

        val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Environment.getExternalStorageDirectory().absolutePath
        } else {
            context.filesDir.absolutePath
        }

ありがとう


このライブラリを使用して、アクセス権を
Ruben Meiring

すでに述べたように、外部ストレージを書き込むために必要な権限が付与され、で構築するときに同じ設定が機能しtargetSdkVersion 28ます。これは許可の問題ではありません!
Dinu、

エラーによると、ファイル/ storage / emulated / 0 / Chirp Auto Tester / 2019_10_17 10:44:43.rawにアクセスするためのpremisionを取得できません:openに失敗しました:EACCES (アクセスが拒否されました)、android 10を使用している場合スコープ付きストレージ
Ruben Meiring

そのために構築するときに機能していることをどのように説明しますtargetSdkVersion 28か?エラーによると、はい、それは権限関連の問題ですが、権限が付与されていないためではありません。
Dinu

2
外部およびリムーバブルストレージ上の任意の場所へのファイルシステムアクセス権がありません。リムーバブルストレージ制限はアンドロイド4.4で添加しました。外部記憶制限はアンドロイド10に加えた
CommonsWare

回答:


15

Android 11以降、ストレージの権限は取り消されており、開発者はSAFまたはMedia Storeを介して必要なストレージにアクセスする別の方法を検討する必要があります。当面は、アプリケーションタグ内のマニフェストに以下を追加することで、使用しているものを引き続き使用できます。

android:requestLegacyExternalStorage="true"

minSDKを19に変更して、権限をgetExternalFilesDir()必要としないパスを取得するために使用することを検討してください。


まだ機能していませんが、間違いなく正しい方向を調べていますが、現在ENOENT (No such file or directory)、ディレクトリは確実に存在しています。getExternalFilesDir()問題を修正する正しい決定について聞こえます。
Dinu

1
ちょっとした更新で、getExternalFilesDir()今のところ使い終わってしまいました。
ディヌ

2

アプリがBuild.VERSION_CODES.Qをターゲットとする場合、このメソッドから返されたパスは、アプリから直接アクセスできなくなります。

    val path = getExternalFilesDir(Environment.DIRECTORY_PICTURES.toString() + 
    File.separator + "Output Folder")
    val file = File(getExternalFilesDir(null), "filename.jpg")

詳細については、ドキュメントにアクセスしてください


-1

Manifest.permission.WRITE_EXTERNAL_STORAGEを再度リクエストする必要があります。

9.0より前では、Manifest.permission.READ_EXTERNAL_STORAGEのみをリクエストし、Manifest.permission.WRITE_EXTERNAL_STORAGEも取得しますが、9.0以降では、要求した権限を1つしか取得できません。

私の貧しい英語を許してください。


これはリクエスト権限の問題ではありません。私はこれについて2、3回言及しましたが、両方のWRITEおよびREAD EXTERNAL_STORAGE権限が付与されています。権限が付与されていても外部ストレージにアクセスできない理由の詳細については、ニコスの回答を参照してください。そして、あなたの英語を心配しないでください、それは素晴らしいです。
ディヌ

/ ** *申告の登録制限、廃止の登録* / public void galleryPicture(){if(ContextCompat.checkSelfPermission(mContext、Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(mContext、new String [] {Manifest.permission.READ_EXTERNAL_STORAGE、Manifest.permission.WRITE_EXTERNAL_STORAGE}、STORAGE_PERMISSIONS_REQUEST_CODE); } else {openPic(mContext、CODE_GALLERY_REQUEST); }}
Gerry_Liang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.