アプリをターゲットAPI 27に切り替えましたが、WRITE_EXTERNAL_STORAGE
権限を付与できません-grantResult
は常に-1
です。
私のアプリは、アプリのプライベート外部ストレージスペースを使用しないため、この権限が必要です(API 19から 必要ありませんWRITE_EXTERNAL_STORAGE
)。
API 26には 許可の動作の変更 があったことを知っています。しかし、これは私の問題を説明していません。
標準的な方法でREAD_EXTERNAL_STORAGE
とWRITE_EXTERNAL_STORAGE
の両方の許可をリクエストしています:
ActivityCompat.requestPermissions(activity, new String[] {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, requestCode);
(両方のアクセス許可は、マニフェストの<uses-permission
を介して宣言されます)。
ダイアログが表示され、「許可」をクリックします。
ただし、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
があるために発生する可能性がありますが、わかりません。
行のどこかで、あなたはそのAndroid:maxSdkVersion="18"
属性を選択しています。私の推測では、それは図書館から来ているということです。独自のマニフェストを編集している場合は、Android Studioの[マージされたマニフェスト]タブを確認してください。さまざまな要素と属性に貢献しているものの詳細が表示されます。
Android:maxSdkVersion
は、少なくともランタイムパーミッションの機能に関して、より高いAndroid SDKバージョン)の<uses-permission>
要素を削除する効果があります。
すべてのバージョンでこの権限が必要なため、tools:remove="Android:maxSdkVersion"
要素に<uses-permission>
を追加すると、Android:maxSdkVersion="18"
が元に戻り、期待どおりの結果が得られます。