web-dev-qa-db-ja.com

KitKat 4.4.2バージョンのSDカードで「EACCES許可が拒否されました」を回避する方法。 Googleからの新しいポリシー

Android KitKat 4.4.2バージョンは、writeaccess用に実装された新しいgoogleポリシーです。これは今のところわかりません。

私は他のアプリでこの問題についてたくさん読みました。 「EACCES許可が拒否されました」を取得します。私のアプリは、zipファイルを書き/解凍する必要があり、sqlite-databaseにも書きます。

Androidバージョン4.4.2 KitKatを使用して、このEACCES許可拒否問題を解決するにはどうすればよいですか?

22
mcfly soft

xda forum ;でこの問題の有効な解決策を見つけました。応援する必要はありません。
例を次に示します。

/**
 * Returns an OutputStream to write to the file. The file will be truncated immediately.
 */
public OutputStream write()
        throws IOException {
    if (file.exists() && file.isDirectory()) {
        throw new IOException("File exists and is a directory.");
    }

    // Delete any existing entry from the media database.
    // This may also delete the file (for media types), but that is irrelevant as it will be truncated momentarily in any case.
    String where = MediaStore.MediaColumns.DATA + "=?";
    String[] selectionArgs = new String[] { file.getAbsolutePath() };
    contentResolver.delete(filesUri, where, selectionArgs);

    ContentValues values = new ContentValues();
    values.put(MediaStore.Files.FileColumns.DATA, file.getAbsolutePath());
    Uri uri = contentResolver.insert(filesUri, values);

    if (uri == null) {
        // Should not occur.
        throw new IOException("Internal error.");
    }

    return contentResolver.openOutputStream(uri);
}
7
WiFi

ドキュメントから:

Android 4.4から、複数の外部ストレージデバイスがContext.getExternalFilesDirs()、Context.getExternalCacheDirs()、およびContext.getObbDirs()を通じて開発者に表示されます。

これらのAPIを通じて表示される外部ストレージデバイスは、デバイスの半永久的な部分である必要があります(バッテリコンパートメントのSDカードスロットなど)。開発者は、これらの場所に保存されたデータが長期間にわたって利用できることを期待しています。このため、一時的なストレージデバイス(USB大容量ストレージドライブなど)は、これらのAPIを介して表示されるべきではありません。

WRITE_EXTERNAL_STORAGEパーミッションは、デバイス上のプライマリ外部ストレージへの書き込みアクセスのみを許可する必要があります。合成されたアクセス許可で許可されているパッケージ固有のディレクトリを除き、アプリはセカンダリ外部ストレージデバイスへの書き込みを許可しないでくださいアンインストール。

9
nikis

次のように、リアルタイムで許可についてAndroidに問い合わせる必要があります。

private static final int MY_PERMISSIONS_REQUEST_STORAGE = 123456;

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Android.Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_STORAGE);
}

@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_STORAGE: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Intent chooserIntent = cameraHelper.openImageIntent();
                    startActivityForResult(chooserIntent, MY_PERMISSIONS_REQUEST_STORAGE);
                }
            }
        }
    }
2
lucasddaniel

現時点で唯一の解決策は、電話をルート化し、ファイルエクスプローラーを使用してルートディレクトリからext sdcardのアクセス許可を変更することによってのみ解決できることです。サムスンギャラクシーS5 S4注3と注2のような携帯電話で。

この苦い事実を投稿してすみません。

この状況から抜け出すことができるグーグル自体からの更新を期待しましょう。

ただし、JBはAndroidの最も便利なOSであるため、jellybeanをKitKatに更新する前に考えてください。また、b/w JBとKitKatの差はそれほど大きくありません。

私が助けてくれたことを願って......

0
Roop The Great