Android Lollipop での SDカードへ書き込み

タグ: | 投稿日: 投稿者:

こんにちは、kikuです。

Lollipop になりアプリからSDカードへ書き込みできるようになりました。
でも書き込みが可能になっただけで、4.3までの様に自由に書けるわけではないんですね。

これが非常にめんどくさいわけです。。。

今日は Lollipop でのSDカードへの書き込み方についてです。

簡単に説明しますと、、
まずユーザにUI操作で明示的にアクセスを許可するディレクトリを指定してもらう必要があります。(←これが厄介です)
その上で Storage Access Framework を使えば出来るようになります。

具体的には ↓ のコードによって遷移する画面上でユーザに許可してもらいます。

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE);

UIで許可してもらったら、onActivityResult に戻ってくるので、そこでアクセスに必用なURIを取得します。
そのURIから DocumentFile を作成しこれでファイルにアクセスできます。
DocumentFile の作成は ↓ こんな感じです。

public void onActivityResult(int reqCode, int resCode, Intent resData) {
  if (reqCode == REQUEST_CODE && resCode == Activity.RESULT_OK) {
    Uri treeUri = resData.getData();
    DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
    // pickedDir でごにょごにょが可能に
  }
}

この取得した URI から作成した DocumentFile を使えばディレクトリ作成やファイル作成等の書き込みができます。
例えばディレクトリ作成なら ↓ こんな感じ

DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
pickedDir.createDirectory("dir_name");

書き込みを行う毎にURIが必用なのでアプリ側で保持しておきましょう。

一応こんな感じで書き込みできます。なかなか取っ付き難くて理解に苦労しました。。(Googleさん、前の仕様に戻して下さい)

もうGoogleさんはSDカードを使わせる気がないっぽいですよね。
今後のアプリはSDカードを使わないでも動くように作るのが良いのかもしれません。

Share on Google+Tweet about this on TwitterShare on StumbleUponShare on Facebook

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>