🌊
バックアップを名前を付けて保存する
バックアップを実装したい
アプリ固有の内部にあるデータを外部に保存したいなと思った
とりあえずgoogleると、
で、いい感じのActivityに飛ばしてくれて、ファイルの作成と開くができるらしい
とてもかんたんで便利。
流れ
- startActivityForresultで、いい感じのActivityに飛ばす
- onActivityResultdeでUriを受け取って、いい感じに加工
実装
- startActivityForresult
- write
MainActivity
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
//mime type
intent.setType("*/*")
//最初に表示される保存ファイル名
intent.putExtra(Intent.EXTRA_TITLE, "保存名");
//開くことが可能な
intent.addCategory(Intent.CATEGORY_OPENABLE);
//飛ばす
//requestCodeは任意のint(onActivityResultdeで帰ってきたよう)
startActivityForResult(Intent.createChooser(intent, "保存先を選択"), requestCode);
- read
MainActivity
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
//mime type
intent.setType("*/*");
//開くことが可能な
intent.addCategory(Intent.CATEGORY_OPENABLE);
//飛ばす
//requestCodeは任意の int(onActivityResultdeで帰ってきたよう)
startActivityForResult(Intent.createChooser(intent, "ファイルの選択"), requestCode);
- onActivityResultde
MainActivity
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//requestCodeを判定
if (requestCode == リクエストコード) {
if (resultCode == RESULT_OK && data != null) {
Uri uri = data.getData();
if (uri != null) {
//read or write
}
}
}
}
ハマったところ
1. UriをFileに変更しようとした。
結論からいうと、しないほうがいいらしい。
解決策、Uriでそのまま、OutputStream or InputStreamを作ればよい。
//outputStream
Context.getContentResolver().openOutputStream(compressUri);
//inputStream
Context.getContentResolver().openInputStream(compressUri);
余計な先入観でFileに変換しようとしたのが間違いだった。
最初から、周辺をgoogleればよかった。
- 保存するファイルの名前が被った場合
これは、ハマったわけではないけど、一応
ファイルを保存するとき、同名になったら、どうしようかと思っていた。
こんな感じの何かを書かないとと思ってた。
public static File createTempFile(File dir, String prefix) throws IOException {
File preFile;
i == 0;
while (true) {
preFile = new File(dir,prefix + (i >0? "("+i+")":""));
if(!preFile.exists()) return preFile;
i++;
}
}
実際に同名で保存してみるとと、勝手に(1),(2)を語尾に付けてくれる。
さすがやった 笑
よかったら
上の機能を使った、バックアップと復元は、アプリ内で実装しています
ぜひ、応援のダウンロードよろしくおねがいします。
Discussion