[android] カメラとギャラリー、それぞれから画像を取得

カメラとギャラリー、それぞれから画像を取得

カメラとギャラリーの選択肢を表示し、ユーザが選択した画像をImageViewに表示させる

Manifest.xml

    
    

Activity.java
*ChooserにGallaryのIntentとCameraのIntentを登録
*onActivityResultで結果を受け取って画像表示している

private ImageButton closeButton;
    private ImageButton photoButton;

    private Uri resultUri;
    private static final int REQUEST_CHOOSER = 1000;
    private final static int REQUEST_PERMISSION = 1002;
    private String filePath;
    private Uri cameraUri;
    private File  cameraFile;
    private Intent intentCamera;


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

        photoButton = (ImageButton)findViewById(R.id.photo_button);
        photoButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _showGallery(); //_showGalleryメソッドを起動
            }
        });
    }

    private void _showGallery() {

        //カメラの起動Intentの用意
        if (Build.VERSION.SDK_INT >= 23) {
            checkPermission();
        }
        else {
            intentCamera = cameraIntent(); //cameraIntentというIntentを返す
        }

        // ギャラリー用のIntent作成
        Intent intentGallery;
        if (Build.VERSION.SDK_INT < 19) {
            intentGallery = new Intent(Intent.ACTION_GET_CONTENT);
            intentGallery.setType("image/*");
        } else {
            intentGallery = new Intent(Intent.ACTION_OPEN_DOCUMENT);
            intentGallery.addCategory(Intent.CATEGORY_OPENABLE);
            intentGallery.setType("image/jpeg");
        }

        //ChooserにGallaryのIntentとCameraのIntentを登録
        Intent intent = Intent.createChooser(intentGallery, "Select Image");
        if(intentCamera!=null){
            intent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {intentCamera});
        }
        startActivityForResult(intent, REQUEST_CHOOSER);
    }

    //
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == REQUEST_CHOOSER) {

            if(resultCode != RESULT_OK) {
                // キャンセル時
                return ;
            }
            
            //dataがnullの場合はギャラリーではなくカメラからの取得と判定しカメラのUriを使う
            resultUri = (data != null ? data.getData() : cameraUri);

            if(resultUri == null) {
                // 取得失敗
                Toast.makeText(this, "Error.Try again.", Toast.LENGTH_LONG).show();
                return;
            }

            // ギャラリーへスキャンを促す
            MediaScannerConnection.scanFile(
                    this,
                    new String[]{resultUri.getPath()},
                    new String[]{"image/jpeg"},
                    null
            );

            // 画像を設定
            ImageView imageView = (ImageView)findViewById(R.id.photo);
            imageView.setImageURI(resultUri);

        }
    }

    private Intent cameraIntent(){
        // 保存先のフォルダーを作成
        File cameraFolder = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "IMG"
        );
        cameraFolder.mkdirs();

        // 保存ファイル名
        String fileName = new SimpleDateFormat("ddHHmmss").format(new Date());
        filePath = cameraFolder.getPath() +"/" + fileName + ".jpg";
        Log.d("debug","filePath:"+filePath);

        // capture画像のファイルパス
        cameraFile = new File(filePath);
        cameraUri = Uri.fromFile(cameraFile);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);

        return intent;
    }

    // Runtime Permission check
    private void checkPermission(){
        // 既に許可している
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
            cameraIntent();
        }
        // 拒否していた場合
        else{
            requestLocationPermission();
        }
    }

    // 許可を求める
    private void requestLocationPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            ActivityCompat.requestPermissions(ClubCreationImageActivity.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION);

        } else {
            Toast toast = Toast.makeText(this, "Camera function is disabled", Toast.LENGTH_SHORT);
            toast.show();

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,}, REQUEST_PERMISSION);

        }
    }

*インターネット上で公開されているコードを利用したが、カメラIntentを作成する度に
謎の画像がギャラリーに登録されて増殖するので手を加えた

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です