GraveDollの備忘録ブログ

勉強したことや捗るグッズの備忘録です。

修行その壱「フォトメモ」(1)

今日から少しずつ、
ちょっと前に買った本 - GraveDollの備忘録ブログ
の修行を進めていきたいと思います。
まずは修行その壱の「フォトメモ」。カメラで撮影した写真に落書きできるアプリです。
あらかじめ用意されているPhotoMemoActivity.javaに実装していきます。

写真を撮影する

import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

// メイン画面(Activity)
public class PhotoMemoActivity extends Activity {
	
	static final int REQUEST_CAPTURE_IMAGE = 100;//onActivityResult内で識別するためのID
	// 描画対象のViewを保持するメンバ変数
	private PhotoMemoView mView;
	
	// 画面(Activity)が生成されるときの処理
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		Uri saveUri;//写真を格納するURI
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//カメラアプリを呼び出す暗黙的インテント
		saveUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/tmp.jpg"));
		intent.putExtra(MediaStore.EXTRA_OUTPUT, saveUri);//カメラアプリをインテントで呼び出すときに写真格納場所情報を渡すよう設定
		startActivityForResult(intent, REQUEST_CAPTURE_IMAGE);//カメラアプリ起動
		// 描画対象のViewを生成し、
		mView = new PhotoMemoView(this);
		// 描画対象のViewを画面に表示する
		setContentView(mView);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //あとで実装します
	}

	// 端末のメニューボタンが押されたときの処理
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// res/menu/menu.xmlを読み込み、メニューを生成する
		getMenuInflater().inflate(R.menu.menu, menu);
		return super.onCreateOptionsMenu(menu);
	}

	// メニューの項目が選ばれたときの処理
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// 選ばれたメニューの種類(ID)に応じて、処理する
		switch (item.getItemId()) {
		// メニュー「線の太さ」の処理
		case R.id.menu_paintwidth:
			// まだ処理を実装していない旨のメッセージを表示する
			Toast.makeText(this, R.string.message_no_function,
					Toast.LENGTH_SHORT).show();
			break;
		// メニュー「線の色」の処理
		case R.id.menu_paintcolor:
			// まだ処理を実装していない旨のメッセージを表示する
			Toast.makeText(this, R.string.message_no_function,
					Toast.LENGTH_SHORT).show();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}
}

撮影出来ました。
f:id:GraveDoll:20140108234447p:plain

  • 本の極意(ヒント)より

カメラアプリをインテントで呼び出す際に写真格納場所を指定する方法と、カメラアプリからの戻り値から写真格納場所を取得する方法がある。

私は前者の方法を使いました。

  • SDカードに保存したいので、SDカードのパスを指定する必要があります。
Environment.getExternalStorageDirectory()

でSDカードのパスを取得できます。

  • まだこのアプリで、撮影した写真を確認することができません。

デバッグで確認したところ、
file:///mnt/sdcard/tmp.jpg
にあるみたいです。
Eclipseで、「ウィンドウ」→「パースペクティブを開く」→「DDMS」
ファイルエクスプローラーで確認すると・・・
f:id:GraveDoll:20140108235042p:plain
ありました。
Pull a file from the deviceで画像を取り出せます。
f:id:GraveDoll:20140108235343p:plain

保存できてますね。
f:id:GraveDoll:20140108235420j:plain


参考にさせていただいたサイト
Starrow Devlog: [Android] intentでカメラアプリを呼び出し画像を取得する
Y.A.M の 雑記帳: Android 外部メディア (外部ストレージ, SD card) の場所を取得する
yan note: Android エミュレータのSDカードにファイルを配置する