web-dev-qa-db-ja.com

API 26以降:WRITE_EXTERNAL_STORAGE権限は常に拒否されます

アプリをターゲットAPI 27に切り替えましたが、WRITE_EXTERNAL_STORAGE権限を付与できません-grantResultは常に-1です。

私のアプリは、アプリのプライベート外部ストレージスペースを使用しないため、この権限が必要です(API 19から 必要ありませんWRITE_EXTERNAL_STORAGE)。

API 26には 許可の動作の変更 があったことを知っています。しかし、これは私の問題を説明していません。

標準的な方法でREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEの両方の許可をリクエストしています:

ActivityCompat.requestPermissions(activity, new String[] {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    }, requestCode);

(両方のアクセス許可は、マニフェストの<uses-permissionを介して宣言されます)。

ダイアログが表示され、「許可」をクリックします。

enter image description here

ただし、onRequestPermissionsResultコールバック内では、-1に対してWRITE_EXTERNAL_STORAGE(拒否)(および0に対してREAD_EXTERNAL_STORAGE(許可))を取得しています。

私は両方をリクエストし、おそらく両方を許可したので、結果は両方とも0であってはなりませんか?

WRITE_EXTERNAL_STORAGEを単独で要求しようとしましたが、この場合、ダイアログはまったく表示されません。

もう1つの詳細:build/intermediates/manifests/full/debugでマージされたマニフェストを確認しましたが、WRITE_EXTERNAL_STORAGE権限に属性Android:maxSdkVersion="18"があります(マニフェストにはそのような属性はありません)。これは、アプリにminApiVersion=21があるために発生する可能性がありますが、わかりません。

18
Denis Kniazhev

行のどこかで、あなたはそのAndroid:maxSdkVersion="18"属性を選択しています。私の推測では、それは図書館から来ているということです。独自のマニフェストを編集している場合は、Android Studioの[マージされたマニフェスト]タブを確認してください。さまざまな要素と属性に貢献しているものの詳細が表示されます。

Android:maxSdkVersionは、少なくともランタイムパーミッションの機能に関して、より高いAndroid SDKバージョン)の<uses-permission>要素を削除する効果があります。

すべてのバージョンでこの権限が必要なため、tools:remove="Android:maxSdkVersion"要素に<uses-permission>を追加すると、Android:maxSdkVersion="18"が元に戻り、期待どおりの結果が得られます。

32
CommonsWare