アプリからカメラ起動して画像を保存する方法

アプリからカメラ起動して撮影した画像を利用したい場合はカメラを起動した後にどこに画像を保存したかを知る必要があります。ここではその方法を簡単に紹介します。

  1. 必要なパーミッション
  2. カメラ起動

必要なパーミッション

カメラを起動するには次の2つのパーミッションをAndroidManifest.xmlに追加します。

    </application>
    
    <uses-permission android:name="android.permission.CAMERA" />
        <!--上の1行を追加-->
    <uses-permission android:name="android.hardware.camera" />
        <!--上の1行を追加-->

</manifest>

カメラの起動

カメラをアプリから起動するにはActivityクラスでstartActivityForResultメソッドにカメラインテントを渡します。

private static final int CAMERA_REQUEST_CODE = 1;
    //onActivityResultメソッドで受け取るコード
private Uri imageUri;
    //カメラで撮影した画像のURI

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File mediaStorageDir = new File(
            Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyApp");
            //カメラ画像を保存するディレクトリ
        if(!mediaStorageDir.exists()){
            if(!mediaStorageDir.mkdirs())
                break;
        }
        String timeStamp = new SimpleDateFormat(
                "yyyy_MM_dd__HH_mm_ss").format(new Date());
            //画像作成日時を表すタイムスタンプ
        File mediaFile = new File(mediaStorageDir.getPath() + File.separator 
                                    + timeStamp + ".png");
            //カメラを起動して実際に保存される画像ファイル名
        cameraImageUri = Uri.fromFile(mediaFile);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
        
        startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
            //カメラアプリを起動
    }

このコードのようにカメラで撮影した画像を保存するためのアプリ専用のディレクトリを作り、そこに撮影日時をタイムスタンプ(例 : 2014_06_25__21_26_00)に持った画像を保存するように設定しています。

このとき撮影した画像のURIをcameraImageUriという変数に保存しています。

次にカメラが起動し、実際に何か画像を撮影した場合はActivityクラスのonActivityResultメソッドでその結果を受け取ることができます。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data
    {
        if(requestCode == this.CAMERA_REQUEST_CODE){
            switch(resultCode){
            case RESULT_OK:    //撮影完了
                try{
                    Toast.makeText(this, 
                            "画像保存パス = " + cameraImageUri.getPath(), 
                            Toast.LENGTH_LONG).show();
                }catch(NullPointerException err){
                    //画像URIがnullだった時の処理
                }
                break;
            case RESULT_CANCELED:    //撮影が途中で中止
                Toast.makeText(this, "撮影が中止されました。").show();
                break;
            default:
                break;
            }
        }
    }

CAMERA_REQUEST_CODEという定数はstartActivityResultメソッドでインテントを発行したときに設定した定数です。

もしカメラのシャッターボタンが押されて画像が保存されたならRESULT_OK以下で画像パスをトーストに表示し、もし途中で撮影がキャンセルされたならRESULT_CANCELD以下の部分で撮影がキャンセルされたことを知らせるトーストを表示しています。

コード部分のまとめ

最後にActivity全体でどのような処理をしていたかのコードをまとめて紹介します。

public class MainActivity extends Activity 
{

    private static final int CAMERA_REQUEST_CODE = 1;
        //onActivityResultメソッドで受け取るコード
    private Uri imageUri;
        //カメラで撮影した画像のURI

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File mediaStorageDir = new File(
            Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES), "MyApp");
            //カメラ画像を保存するディレクトリ

        if(!mediaStorageDir.exists()){
            if(!mediaStorageDir.mkdirs())
                break;
        }
        String timeStamp = new SimpleDateFormat(
                "yyyy_MM_dd__HH_mm_ss").format(new Date());
            //画像作成日時を表すタイムスタンプ
        File mediaFile = new File(mediaStorageDir.getPath() + File.separator 
                                    + timeStamp + ".png");
            //カメラを起動して実際に保存される画像ファイル名
        cameraImageUri = Uri.fromFile(mediaFile);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
        
        startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE);
            //カメラを起動
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if(requestCode == this.CAMERA_REQUEST_CODE){
            switch(resultCode){
            case RESULT_OK:    //撮影完了
                try{
                    Toast.makeText(this, 
                            "画像保存パス = " + cameraImageUri.getPath(), 
                            Toast.LENGTH_LONG).show();
                }catch(NullPointerException err){
                    //画像URIがnullだった時の処理
                }
                break;
            case RESULT_CANCELED:    //撮影が途中で中止
                Toast.makeText(this, "撮影が中止されました。").show();
                break;
            default:
                break;
            }
        }
    }

}
関連項目
プライバシーポリシー