DocumentsProvider にファイルの場所でナビゲーションを開始させるためIntent.ACTION_OPEN_DOCUMENT
に、 file:// 形式の Uri を追加で使用することは可能ですか?DocumentsContract.EXTRA_INITIAL_URI
私のアプリでは、カスタム設定ファイルを使用するオプションをユーザーに提供します。ユーザーがこのオプションを選択すると、アプリのデータ フォルダーにデフォルト ファイルの例が作成されます (によって返されますgetExternalFilesDir
)。
カスタムファイルを選択するとき、DocumentsProvider が現在選択されているファイルが置かれているフォルダーを を使用して開くようにしますEXTRA_INITIAL_URI
。ACTION_OPEN_DOCUMENT
返される Uri のcontent://
形式が正しいため、以前にインテントで選択されたファイルがある場合は問題ありません。
ユーザーが初めてファイルを選択する前に問題が発生し、作成された既定のカスタム ファイルへの URI しか利用できません。ファイルは によってFile.createNewFile
返されるディレクトリ内でを使用して作成され、Context.getExternalFilesDir
を使用して URI が生成されUri.fromFile(file)
、結果としてfile://
URI の形式になります。
簡単なコード例を次に示します。
カスタムファイルを作成しています。のような Uri を返しますfile:///storage/emulated/0/Android/data/com.example.testsapp/files/customFile.txt
fun createFile(context: Context): Uri {
val appDir = context.getExternalFilesDir(null)
val customFile = File(appDir, "customFile.txt")
customFile.createNewFile()
// writing to customFile via FileOutputStream(file)
return Uri.fromFile(customFile)
}
ユーザーにカスタム ファイルを選択させる:
fun pickNewFile(fileUri: Uri) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "*/*"
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, fileUri)
intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)
startActivityForResult(intent, FILE_PICKER_REQUEST_CODE)
}
fileUri がfile://
フォーマットされている場合、DocumentsProvider はファイルのディレクトリで開かず、代わりにデフォルト ディレクトリを表示します。ユーザーが新しいカスタム ファイルを選択すると、onActivityResult
メソッドは次のような新しい Uri を提供します。content://com.android.externalstorage.documents/document/primary%3AAndroid%2Fdata%2Fcom.example.testsapp%2Ffiles%2FcustomFile.txt
この URI をpickNewFile
メソッドで使用すると、ファイルのディレクトリで開かれます。
file://
タイプ Uri をタイプ Uriに変換する方法はありcontent://
ますか?