くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Androidでファイル選択してSDカードとかにコピーする

Androidで、選択したファイルをコピーしたいなぁと思ったので、調べたときの備忘録。

大まかな手順は以下な感じ。

  1. ファイルを選択する
  2. コピー先のパスを取得する
  3. UriからFileへコピーする

1. ファイルを選択する

private final static int CHOSE_FILE_CODE = 12345;

// インテントを発行して、ファイル選択Activityを開く
public void onClickButton() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/jpeg");
    startActivityForResult(intent, CHOSE_FILE_CODE);
}

// 選択したファイルのUriを受け取る
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == CHOSE_FILE_CODE && resultCode == RESULT_OK && data != null) {
        Uri uri = data.getData();
        // 後は、取得したファイルをごにょごにょする
    }
}

2. コピー先のパスを取得する

File filesDir = activity.getFilesDir(); // '/data/data/${applicationId}/files'のFile
File sdCardDir = Environment.getExternalStorageDirectory(); // SDカードのルートのFile

3. UriからFileへコピーする

// AndoridでUriのファイルをコピーする
// AndroidではUriをFile変換するのは大変なので、InputStreamでコピーする方法にした
public static void copyFile(@NonNull Activity activity,
                            @NonNull Uri src, @NonNull File dest) throws IOException {
    InputStream in = null;
    FileOutputStream out = null;
    try {
        in = activity.getContentResolver().openInputStream(src);
        if (in == null) throw new NullPointerException();

        out = new FileOutputStream(dest);
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) out.write(buf, 0, len);
    } finally {
        // compile 'commons-io:commons-io:2.5'をつかってます
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(out);
    }
}

以上!!

参考にしたサイト様