ギャラリーからファイルを選ぶ
Android 端末のカメラを利用して写真を撮影する、動画を録画する等すると 通常 "ギャラリー" (Gallery) からそれらのファイルへ一元的にアクセス可能になるようになります。
このためカメラで写真を撮りその写真へアクセスしたいときには、いちいち「どのカメラで撮影したか」 ということなどは意識する必要がなく、Gallery に取りに行けば OK です。
この資料ではアプリケーションからファイルを選択する方法を紹介します。
ここで作るアプリケーションは次のような動きをします。
画面にはボタンがひとつ配置してあります。
ボタンをクリックすると、ギャラリーが開きます。
ここでファイルを選択すると、ギャラリーが閉じてもとの画面に戻ります。
もとの画面 (アクティビティ) ではギャラリーでのファイル選択の情報を拾い、それをトースト通知で表示します。
では、さっそくプログラムを作ってみましょう。
レイアウトは次の通り。ボタンをひとつ配置しているだけです。
<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 が呼ばれ、そこでリクエストコードと結果コードを読み、 問題が無い場合データを抽出します。