ギャラリーからファイルを選ぶ

Android 端末のカメラを利用して写真を撮影する、動画を録画する等すると 通常 "ギャラリー" (Gallery) からそれらのファイルへ一元的にアクセス可能になるようになります。

このためカメラで写真を撮りその写真へアクセスしたいときには、いちいち「どのカメラで撮影したか」 ということなどは意識する必要がなく、Gallery に取りに行けば OK です。

この資料ではアプリケーションからファイルを選択する方法を紹介します。

ここで作るアプリケーションは次のような動きをします。

画面にはボタンがひとつ配置してあります。

Android ギャラリーからファイルを選ぶ

ボタンをクリックすると、ギャラリーが開きます。

Android ギャラリーからファイルを選ぶ

ここでファイルを選択すると、ギャラリーが閉じてもとの画面に戻ります。

もとの画面 (アクティビティ) ではギャラリーでのファイル選択の情報を拾い、それをトースト通知で表示します。

Android ギャラリーからファイルを選ぶ

では、さっそくプログラムを作ってみましょう。

レイアウトは次の通り。ボタンをひとつ配置しているだけです。

<RelativeLayout xmlns:android="http://s...
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pick File from Gallery"
        android:id="@+id/pickButton"/>    
</RelativeLayout>

xmlns は省略していますので実際はちゃんと書きましょう。

ギャラリーを起動してそこで何かして戻ってくる・・・これは Intent でアクティビティを開始して、 onActivityResult でその結果を取得する、という流れになります

具体的に次のようにします。

package com.keicode.android.test.gallerytest1;

import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.MediaStore.Images.Media;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity
  implements OnClickListener {

  Button pickButton;
  int RESULT_PICK_FILENAME = 1;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    pickButton = (Button)findViewById(R.id.pickButton);
    pickButton.setOnClickListener(this);
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
  }
  
  public void onClick(View v) {
    switch(v.getId()){
    case R.id.pickButton:
      pickFilenameFromGallery();
      break;
    }
  }
  
  private void pickFilenameFromGallery() {
    Intent i = new Intent(
      Intent.ACTION_PICK,
      Media.EXTERNAL_CONTENT_URI);  
    startActivityForResult(i, RESULT_PICK_FILENAME);
  }
  
  @Override
  protected void onActivityResult(
    int requestCode,
    int resultCode,
    Intent data) {
  
    super.onActivityResult(requestCode, resultCode, data);
  
    if (requestCode == RESULT_PICK_FILENAME
      && resultCode == RESULT_OK
      && null != data) {
      Uri selectedImage = data.getData();
      String[] filePathColumn = { Media.DATA };
    
      Cursor cursor = getContentResolver().query(
        selectedImage,
        filePathColumn, null, null, null);
      cursor.moveToFirst();
    
      int columnIndex 
        = cursor.getColumnIndex(filePathColumn[0]);
      String picturePath = cursor.getString(columnIndex);
      cursor.close();
    
      Toast.makeText(
        this, 
        picturePath, 
        Toast.LENGTH_LONG).show();
    }
  }
}

さて、ポイントはまず前述の通りアクティビティを起動するところですが、 これはアクションとして ACTION_PICK、URI を Media.EXTERNAL_CONTENT_URI と指定します。

ギャラリーから戻ってきたときに onActivityResult が呼ばれ、そこでリクエストコードと結果コードを読み、 問題が無い場合データを抽出します。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門