前提
kotlinを使用してフォルダの選択機能を持つアプリを作成しています。
ActivityResultContracts.OpenDocumentTree を使用することでAndroid10までは実現できたのですが、Android11以降はDownloadフォルダが選択することができなくなってしまいました。
Androidの仕様が変わったためだということは理解しています。
実現したいこと
・Downloadフォルダを含めた、任意のフォルダを選択したい
該当のソースコード
private var onSelectFolderButtonClickListener = View.OnClickListener { folderLauncher.launch(null) } private val folderLauncher = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { if (it == null) return@registerForActivityResult val context = this@Activity // URIの永続的パーミッションを取得 val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION context.contentResolver.takePersistableUriPermission(it, takeFlags) . . . }
該当のソースコード2
private var onSelectFolderButtonClickListener = View.OnClickListener { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE) startActivityForResult(intent, REQUEST_CODE) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) { val uri = data?.data ?: return contentResolver.takePersistableUriPermission( uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) } . . . }
試したこと
・MANAGE_EXTERNAL_STORAGEを取得して確認しましたが変わりませんでした。
上記の手法に拘らず、Android11以降でフォルダを選択する方法(関数、ライブラリ等)をご教示いただきたく、どうぞよろしくお願いいたします。
> Downloadフォルダを含めた、任意のフォルダを選択
不良なアプリからユーザの情報を守る為、今後も何でも出来るという状況にはならないと思います。
特定のフォルダに絞ってアクセスするしか無いでしょう。
Intent.ACTION_OPEN_DOCUMENT_TREE でいけるのではないでしょうか。
コメントありがとうございます。
しかし、Intent.ACTION_OPEN_DOCUMENT_TREEを使用してみましたが結果は変わりませんでした。
Downloadフォルダを選択しようとすると、「プライバシーを保護するため、別のフォルダを選択してください」と表示され選択できませんでした。
一応、使用したソースコードを追記します。(該当のソースコード2)
jimbeさんの仰る通り、Downloadフォルダ等の一部のフォルダの指定は諦めるべきでしょうか。。。
ストレージ デバイスのすべてのファイルを管理する
https://developer.android.com/training/data-storage/manage-all-files?hl=ja
では、 MANAGE_EXTERNAL_STORAGE と ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION で大体はアクセス出来そうに書いてありますが Download フォルダについては直接は書いていないのでどうなっているのか分かりませんね。
まぁ
>ただし、ストレージ アクセス フレームワークを使用している場合は、MANAGE_EXTERNAL_STORAGE 権限がなくてもアクセスできるファイルまたはディレクトリにしかアクセスできません。
という文がありますので、 SAF 以外の方法でしか出来ない=選択 UI から自分で作るしかないのかもしれません。
返信ありがとうございます。
やはり自作しかなさそうですね。
もう少し情報収集しながら、自作か諦めるか検討したいと思います。
ありがとうございました。
回答1件
あなたの回答
tips
プレビュー