0

DocumentsProvider にファイルの場所でナビゲーションを開始させるためIntent.ACTION_OPEN_DOCUMENT に、 file:// 形式の Uri を追加で使用することは可能ですか?DocumentsContract.EXTRA_INITIAL_URI

私のアプリでは、カスタム設定ファイルを使用するオプションをユーザーに提供します。ユーザーがこのオプションを選択すると、アプリのデータ フォルダーにデフォルト ファイルの例が作成されます (によって返されますgetExternalFilesDir)。

カスタムファイルを選択するとき、DocumentsProvider が現在選択されているファイルが置かれているフォルダーを を使用して開くようにしますEXTRA_INITIAL_URIACTION_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://ますか?

4

1 に答える 1