🌊

バックアップを名前を付けて保存する

2021/06/01に公開

バックアップを実装したい

アプリ固有の内部にあるデータを外部に保存したいなと思った

とりあえずgoogleると、

https://developer.android.com/training/data-storage/shared/documents-files?hl=ja

で、いい感じのActivityに飛ばしてくれて、ファイルの作成と開くができるらしい

とてもかんたんで便利。

流れ

  1. startActivityForresultで、いい感じのActivityに飛ばす
  2. onActivityResultdeでUriを受け取って、いい感じに加工

実装

  1. 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);
  1. 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ればよかった。

  1. 保存するファイルの名前が被った場合

これは、ハマったわけではないけど、一応

ファイルを保存するとき、同名になったら、どうしようかと思っていた。

こんな感じの何かを書かないとと思ってた。

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)を語尾に付けてくれる。

さすがやった 笑

よかったら

上の機能を使った、バックアップと復元は、アプリ内で実装しています

ぜひ、応援のダウンロードよろしくおねがいします。

https://play.google.com/store/apps/details?id=io.github.povec

Discussion