インポート、エクスポート

ViewModleでの書き方

Androidで他デバイスと共有するなら、Storage Access Framework(SAF)経由でユーザーが選択したファイルへ書き出し/読み込みするのがよいです。

TableDataStore に追加するなら以下のような形になります。

import android.content.Context
import android.net.Uri

エクスポート

インポート

Compose側での変数宣言

で呼び出せます。

さらにiOS版との互換性を重視するなら、エクスポート時の拡張子を .enc にして、

CreateDocument("application/octet-stream")

の代わりに

CreateDocument("application/x-tablememo")

のような独自MIMEタイプを定義しておくと、ユーザーが誤って編集しにくくなります。現在の save() / load()と同じ暗号化フォーマットを使うため、iOS版の tableData.enc とAndroid版のエクスポートファイルはそのまま相互利用できます。

実際の使い方

Jetpack Composeでは通常、rememberLauncherForActivityResult() と ActivityResultContracts を使います。

インポート(ファイルを選択する)

ボタンを押してAndroid標準のファイル選択ダイアログを表示する例です。


エクスポート(保存先を選択する)


.enc ファイルだけ表示したい場合

Androidは独自拡張子での絞り込みが少し弱いので、

importLauncher.launch(
    arrayOf("application/octet-stream")
)

または

importLauncher.launch(
    arrayOf("*/*")
)

としておいて、選択後に

val fileName = DocumentFile.fromSingleUri(
    context,
    uri
)?.name

if (fileName?.endsWith(".enc") != true) {
    // エラー表示
    return@launch
}

のように判定するのが実用的です。


長期的に同じファイルを扱う場合

ユーザーが一度選択したファイルを次回起動時も使いたいなら、

context.contentResolver.takePersistableUriPermission(
    uri,
    Intent.FLAG_GRANT_READ_URI_PERMISSION or
    Intent.FLAG_GRANT_WRITE_URI_PERMISSION
)

を実行しておくと、再度ファイル選択ダイアログを出さなくてもその Uri を保存して利用できます。

ただ、iOS版の「共有用インポート・エクスポート」に近い使い方なら、毎回 OpenDocument / CreateDocument を呼ぶだけで十分だと思います。

タイトルとURLをコピーしました