質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2195閲覧

Androidでのフォルダ選択について

bluvenz

総合スコア22

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2023/01/04 11:18

編集2023/01/04 15:27

前提

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以降でフォルダを選択する方法(関数、ライブラリ等)をご教示いただきたく、どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/01/04 13:37

> Downloadフォルダを含めた、任意のフォルダを選択 不良なアプリからユーザの情報を守る為、今後も何でも出来るという状況にはならないと思います。 特定のフォルダに絞ってアクセスするしか無いでしょう。 Intent.ACTION_OPEN_DOCUMENT_TREE でいけるのではないでしょうか。
bluvenz

2023/01/04 15:27

コメントありがとうございます。 しかし、Intent.ACTION_OPEN_DOCUMENT_TREEを使用してみましたが結果は変わりませんでした。 Downloadフォルダを選択しようとすると、「プライバシーを保護するため、別のフォルダを選択してください」と表示され選択できませんでした。 一応、使用したソースコードを追記します。(該当のソースコード2) jimbeさんの仰る通り、Downloadフォルダ等の一部のフォルダの指定は諦めるべきでしょうか。。。
jimbe

2023/01/04 18:54

ストレージ デバイスのすべてのファイルを管理する 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 から自分で作るしかないのかもしれません。
bluvenz

2023/01/06 05:32

返信ありがとうございます。 やはり自作しかなさそうですね。 もう少し情報収集しながら、自作か諦めるか検討したいと思います。 ありがとうございました。
guest

回答1

0

自己解決

結論から言いますと、今回は諦めようかと思います。
将来的には自作予定です。

jimbe様、コメントありがとうございました。

投稿2023/01/23 07:57

bluvenz

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問