アプリtargetSdkのlevelによっては端末API Levelに関わらずpermissionが不要になる処理が存在する

Environment.DIRECTORY_DOWNLOADSへアクセスするにはREAD_EXTERNAL_STORAGE及びWRITE_EXTERNAL_STORAGEが必要となるが、アプリケーションのtargetSdkをQ以上にすると全APIレベルにおいてpermissionが不要になる件についての検証と考察をまとめました。
3
Moyuru Aizawa @MoyuruAizawa

targetがQ以上だとEnvironment#DIRECTORY_DOWNLOADSへのアクセスに WRITE_EXTERNAL_STORAGEが不要になるのはScoped Storage等で整備された結果なのでしょうか。targetをQ以上にしたらQ未満のOSも含めてpermission不要になるってのがにわかには信じがたいのですが、なにかご存知ですか? #DroidKaigi

2021-10-21 17:01:08
どくぴー @e10dokup

最後、ENVIRONMENT_DOWNLOADSへのアクセスのパーミッションの話で「minSdkVersionがQ以上であれば権限いらない?」みたいな事を言ったんですが、「targetSdkVersionがQ以上であれば」でしたね、訂正します :bow: しかしドキュメントにはたしかにそう書いてるんですが、どうなんだろう…? #DroidKaigi

2021-10-21 17:18:42
Moyuru Aizawa @MoyuruAizawa

@e10dokup まさしくぼくもそこについて聴きたかった twitter.com/MoyuruAizawa/s…

2021-10-21 17:19:14
どくぴー @e10dokup

@MoyuruAizawa 正直、DIRECTORY_DOWNLOADSへのアクセスをまともにしたことがないのでここちょっとわからないですね…、時間があるときにもう少し調べてみようと思います

2021-10-21 17:24:00
Daruma / Jumpei Matsuda @red_fat_daruma

@MoyuruAizawa @e10dokup ちゃんとやってないんだけど、「指定を消していい」じゃなくて 「29以上にいらない(== maxSdkVersion をつけていい)」じゃない? - target 28以下 or 29 && 例のフラグ=true -> 全部 write permissionチェック - target 30 -> 28以下の分岐はpermissionチェックへ、29以上は新しい方で動かす じゃない?

2021-10-21 17:40:42
どくぴー @e10dokup

@red_fat_daruma @MoyuruAizawa あー、それがしっくりきますね、Scoped Storage的にもその扱いなので一貫性もありそう…

2021-10-21 17:43:32
Moyuru Aizawa @MoyuruAizawa

@red_fat_daruma @e10dokup まぁじ?怖いなぁ。これ読むとtargetSdkによってpermissionの要不要が変わるという用に解釈できるんだけど、ぼくもだるまの言ってる事のほうがしっくりくるから、怖いんだよね。 一応エミュレーターでtarget 31のアプリをPで動かして、たしかに不要だったんだけど、もう一度ミニマム構成で試してみるよ

2021-10-21 17:44:06

For applications targeting Build.VERSION_CODES.Q or above, WRITE_EXTERNAL_STORAGE permission is not needed and the dirType must be one of the known public directories like Environment#DIRECTORY_DOWNLOADS, Environment#DIRECTORY_PICTURES, Environment#DIRECTORY_MOVIES, etc.

引用元: developer.android.com - DownloadManager.Request

アプリケーションのtargetSdkによって、実行環境のAPI Levelに左右されず、WRITE_EXTERNAL_STORAGEを伴わずにEnvironment#DIRECTORY_DOWNLOADSへアクセスできるようになる原理がわからず、Documentを鵜呑みにできない3人

Moyuru Aizawa @MoyuruAizawa

@red_fat_daruma @e10dokup `targeting Q` というのは `targetSdkがQ` という意味ではない とも解釈することも可能か

2021-10-21 17:46:12
どくぴー @e10dokup

@MoyuruAizawa @red_fat_daruma あー、この記述だとこれはOSバージョン非依存っぽい…なるほど…

2021-10-21 17:46:21
Daruma / Jumpei Matsuda @red_fat_daruma

@e10dokup @MoyuruAizawa これはオリジナルが悪いので「もっとわかりやすくして」って送ったほうがいいやつだ

2021-10-21 17:48:08

ScopedStorageも絡んでいる可能性があるので検証方法をみなすべきというアドバイスをもらう。

Moyuru Aizawa @MoyuruAizawa

@red_fat_daruma @e10dokup あれ、targeting Qであれば端末のAPIレベルに関わらずpermission不要になるということ、minSdk Qという意味じゃないのでminSdk PでもPでpermission不要ということ確認ということでPでためしたんだけど、なにか勘違いしてるかなおれ

2021-10-21 17:57:36
Daruma / Jumpei Matsuda @red_fat_daruma

@MoyuruAizawa @e10dokup Pは元々scoped storageの実装があるので動いてしまうと思う(多分)

2021-10-21 17:58:56

改めてコードをかいてAPI Level Oのエミュレーターで検証した上で結果とそのコードを公開することに。

Moyuru Aizawa @MoyuruAizawa

@e10dokup @red_fat_daruma 僕がサンプルプロジェクトつくってGitHubに公開して共有します!!

2021-10-21 17:47:52
どくぴー @e10dokup

@MoyuruAizawa @red_fat_daruma わーい、ありがとうございます!!

2021-10-21 17:48:16