Androidで、選択したファイルをコピーしたいなぁと思ったので、調べたときの備忘録。
大まかな手順は以下な感じ。
- ファイルを選択する
- コピー先のパスを取得する
- 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); } }
以上!!