web-dev-qa-db-ja.com

Android:カメラインテントの使用中にonActivityResultでアプリがクラッシュする

アプリで画像をキャプチャするためにカメラの意図を使用しています。カメラの使用中にアプリがAndroid 5.0.2でクラッシュする問題。フラグメントからインテントを使用しています。以下はフラグメント内の私のコードです:

写真を撮る方法

private void takePhoto() {
    mHighQualityImageUri = Util.generateTimeStampPhotoFileUri(getActivity());
    Log.d(UploadPicturesFragment.class.getSimpleName(),
            "URI: " + mHighQualityImageUri.toString());
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mHighQualityImageUri);
    startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
}

フラグメント内のonActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        return;
    }

    if (requestCode == REQUEST_IMAGE_CAPTURE) {
    Log.d(UploadPicturesFragment.class.getSimpleName(),
                "IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
                    mHighQualityImageUri);
            DroomUtil.beginCrop(mHighQualityImageUri, getActivity(), this, true, bitmap.getWidth(),
                    bitmap.getHeight());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ログトレース

12-29 10:28:03.491: E/AndroidRuntime(9780): Java.lang.RuntimeException:       Unable to resume activity {in.droom/in.droom.activity.MainActivity}:     Java.lang.RuntimeException: Failure delivering result    ResultInfo{who=Android:fragment:2, request=1, result=-1, data=null} to activity   {in.droom/in.droom.activity.MainActivity}: Java.lang.NullPointerException:   Attempt to invoke virtual method 'Java.lang.String Android.net.Uri.getScheme()'   on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:3224)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:3257)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2479)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.access$800(ActivityThread.Java:144)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1359)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.os.Handler.dispatchMessage(Handler.Java:102)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.os.Looper.loop(Looper.Java:155)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.main(ActivityThread.Java:5702)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Java.lang.reflect.Method.invoke(Native Method)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Java.lang.reflect.Method.invoke(Method.Java:372)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1029)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:824)
12-29 10:28:03.491: E/AndroidRuntime(9780): Caused by: Java.lang.RuntimeException: Failure delivering result ResultInfo{who=Android:fragment:2, request=1, result=-1, data=null} to activity {in.droom/in.droom.activity.MainActivity}: Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3881)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:3197)
12-29 10:28:03.491: E/AndroidRuntime(9780):     ... 11 more
12-29 10:28:03.491: E/AndroidRuntime(9780): Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.net.Uri.getScheme()' on a null object reference
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.content.ContentResolver.openInputStream(ContentResolver.Java:651)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.provider.MediaStore$Images$Media.getBitmap(MediaStore.Java:1019)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at in.droom.fragments.UploadPicturesFragment.onActivityResult(UploadPicturesFragment.Java:395)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.Activity.dispatchActivityResult(Activity.Java:6164)
12-29 10:28:03.491: E/AndroidRuntime(9780):     at Android.app.ActivityThread.deliverResults(ActivityThread.Java:3877)
12-29 10:28:03.491: E/AndroidRuntime(9780):     ... 12 more

行番号395は:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),
                    mHighQualityImageUri);
17
Nitish
_Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.net.Uri.getScheme()' on a null object reference
_

つまり、mHighQualityImageUrinullである可能性があります。これは、onSaveInstanceState()を使用してUriを保持できなかった場合に発生します。アプリがバックグラウンドにあり、カメラアプリがフォアグラウンドにある間にプロセスが終了する可能性があります。

12
CommonsWare

カメラから写真を撮り、ImageViewに表示するには、以下の手順に従ってください

1)カメラインテントを開始

Uri fileUri;
String photoPath = "";

 private void startingCameraIntent()
    {
        String fileName = System.currentTimeMillis()+".jpg";
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, fileName);
        fileUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        startActivityForResult(intent, YOUR_REQ_CODE);
    }

2)onActivityResult関数のコールバック

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if (resultCode == Activity.RESULT_OK)
        {
            try
            {
                photoPath = getPath(fileUri);

                System.out.println("Image Path : " + photoPath);

                Bitmap b = decodeUri(fileUri);
                your_image_view.setImageBitmap(b);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }

3)decodeUri関数

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException
    {
        BitmapFactory.Options o = new BitmapFactory.Options();

        o.inJustDecodeBounds = true;

        BitmapFactory.decodeStream(getContentResolver()
                                           .openInputStream(selectedImage), null, o);

        final int REQUIRED_SIZE = 72;

        int width_tmp = o.outWidth, height_tmp = o.outHeight;

        int scale = 1;

        while (true)
        {
            if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
            {
                break;
            }
            width_tmp /= 2;

            height_tmp /= 2;

            scale *= 2;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();

        o2.inSampleSize = scale;

        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                                           .openInputStream(selectedImage), null, o2);

        return bitmap;
    }

4)ImageのgetPath

@SuppressWarnings("deprecation")
    private String getPath(Uri selectedImaeUri)
    {
        String[] projection = { MediaStore.Images.Media.DATA };

        Cursor cursor = managedQuery(selectedImaeUri, projection, null, null,
                                     null);

        if (cursor != null)
        {
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

            return cursor.getString(columnIndex);
        }

        return selectedImaeUri.getPath();
    }

最後にマニフェストで許可を定義する

 <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>

注:マシュマロ(Android 6.0)を使用している場合は、カメラアプリを使用する前に権限チェックを設定します。 Android 実行時に許可をリクエストする

6
Zubair Ahmed

まず、datanull内のonActivityResultであるかどうかを確認します。追加コードを追加して、アプリのクラッシュを防ぎます、このように

public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK && data !=null) {
    return;
}
}

次に、このレッスンを検討してください 既存のカメラアプリケーションを使用して写真をキャプチャする方法

カメラの許可のリクエスト の使用 ses-featureタグサムネイルの取得フルサイズの写真の保存 に関する完全なリファレンスがあります。 =、およびあなたのタスクを達成するためにあなたに非常に役立つかもしれないより多くの...

4
Shree Krishna
    please check your path from mHighQualityImageUri because output path is not found, below code is modify please check it, it work and remember camera result is give in Main Activity class because You used Fragment so declare on activity Result in Main Activity (Fragment Activity) class.   
//on Fragment Class
private void takePhoto() {
             /*   mHighQualityImageUri = Util.generateTimeStampPhotoFileUri(getActivity());
                Log.d(UploadPicturesFragment.class.getSimpleName(),
                        "URI: " + mHighQualityImageUri.toString());*/
                imageUri =Uri.fromFile(new File("/sdcard/"));
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                context.startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
            }

    //on Main Activity Class
      @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 1) {
             /*   Log.d(UploadPicturesFragment.class.getSimpleName(),
                        "IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));*/
                try {

                    /*if(imageUri==null){
                        Log.i("Bitmap", "Image URI Null");
                    }else {
                        Log.i("Bitmap","Image URI is not Null");
                    }*/
                    Uri imageUri = Uri.fromFile(new File("/sdcard/"));
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),imageUri);
    //                        mHighQualityImageUri);
                    if(bitmap !=null)
                    {
                        Log.i("Bitmap", "Bitmap not Null");
                    }else {
                        Log.i("Bitmap","Bitmap is Null");
                    }
                    //  DroomUtil.beginCrop(mHighQualityImageUri, getActivity(), this, true, bitmap.getWidth(),
                    // bitmap.getHeight());
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
2
Krunal Patel

Androidでは、カメラとギャラリーで画像を選択するためのさまざまな動作を示すさまざまなデバイスを見てきました。より良い方法は次のとおりです:

  1. アプリでコンテンツプロバイダーを作成します。
  2. コンテンツプロバイダーからUriを取得し、カメラのインテントに渡します。
  3. カメラはキャプチャした画像をUriに書き込みます。
  4. Context.getContentResolver()。openInputStream()を使用して読み取ります。

このメソッドは、ユーザーがUriを所有しているため、返されるUriから意図的にコードを独立させます。また、これは小さな変更を加えたギャラリー画像の選択もサポートしています。

カメラにもデバイスの向きの問題があるようです。これは(残念ながら)後処理ステップで画像を取得するアプリで処理する必要があります。そのためのコードの概要も以下に示します。ほとんどの場合、カメラが横向きモードでのみ画像をキャプチャするSamsungデバイスで方向の問題が発生しました。

画像のUriの作成:

string imageId = "IMG" + System.currentTimeMillis();
Uri attachmentUri = Uri.parse("content://"+ AttachmentContentProvider.AUTHORITY + "/images/" + imageId); 
// Store this as a member in your activity/fragment as mAttachmentUri

:共有設定またはonSaveInstanceState()を使用するアクティビティバンドルを使用してmAttachmentUriを永続化することが重要です。

カメラの意図の取得:

public static Intent getImageCaptureIntent(Context context, Uri outputFileUri)
{
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    return cameraIntent;
}

画像の読み取り:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    if (resultCode != Activity.RESULT_OK) {
        return;
    }

    if (requestCode == REQUEST_IMAGE_CAPTURE) 
    {

        try {
            Bitmap bitmap = decodeSampledBitmapFromResource(getActivity(), mAttachmentUri, Config.RGB_565);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

    public static Bitmap decodeSampledBitmapFromResource(Context context, Uri uri, Config config)
    { 
        Bitmap bmp = null;
        InputStream is = null;
        if (uri != null)
        {
            try
            {
                is = context.getContentResolver().openInputStream(uri);

                boolean resize = true;
                // First decode with inJustDecodeBounds=true to check dimensions
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(is, null, options);
                mLogger.d("Image Original Width:" + options.outWidth + " Height:" + options.outHeight );
                // close and open the stream again
                is.close();

                is = context.getContentResolver().openInputStream(uri);
                int reqWidth = options.outWidth;
                int reqHeight = options.outHeight;

                // Decode bitmap with inSampleSize set
                options.inJustDecodeBounds = false;
                options.inPreferredConfig = config;     
                bmp = BitmapFactory.decodeStream(is, null, options);

                if(bmp != null)
                {
                    bmp = correctImageRotation(context, bmp, uri);
                }
                else
                {
                    mLogger.e("BitmapFactory.decodeStream returned null bitmap , skip correctImageRotation");
                }
            }
            catch (FileNotFoundException fnfex)
            {
                mLogger.e("FileNotFoundException : while decoding inline image bitmap: " + fnfex.getMessage());
            }
            catch (IOException ioex)
            {
                mLogger.e("IOException : while decoding inline image bitmap: " + ioex.getMessage());
            }
            catch (OutOfMemoryError e)
            {
                mLogger.e("OutOfMemoryError : in decodeSampledBitmapFromResource BitmapFactory.decodeStream . Skip loading Resource");
            }
            finally
            {
                try
                {
                    if (is != null)
                    {
                        is.close();
                    }
                }
                catch (IOException ioex2)
                {
                    mLogger.e("IOException2 : while decoding inline image bitmap: " + ioex2.getMessage());
                }
            }
        }
        return bmp;
    }

    // Seemed necessary on a lot of Samsung devices
    public static Bitmap correctImageRotation( Context context, Bitmap bitmap , Uri inputUri ) throws FileNotFoundException
    {
        int orientation = ExifInterface.ORIENTATION_UNDEFINED;

        try
        {
            String appfilesDir = context.getApplicationContext().getFilesDir().getAbsolutePath();
            String attachmentDirPath = appfilesDir + ('/') + "images");
            String fileName = ContentUris.parseId(uri) + ".jpg";
            String absolutePath = attachmentDirPath + ('/') + fileName;
            ExifInterface exif = new ExifInterface(path);
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
        }
        catch (IOException e)
        {
        }

        return rotateBitmap(bitmap, orientation);
    }

    /**
     * rotate bitmap code reference:
     * http://stackoverflow.com/questions/20478765/how-to-get-the-correct-orientation-of-the-image-selected-from-the-default-image
     */
    private static Bitmap rotateBitmap(Bitmap bitmap, int orientation)
    {
        Matrix matrix = new Matrix();
        switch (orientation)
        {
        case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
            matrix.setScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_180:
            matrix.setRotate(180);
            break;
        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            matrix.setRotate(180);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_TRANSPOSE:
            matrix.setRotate(90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.setRotate(90);
            break;
        case ExifInterface.ORIENTATION_TRANSVERSE:
            matrix.setRotate(-90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.setRotate(-90);
            break;
        case ExifInterface.ORIENTATION_NORMAL:
        case ExifInterface.ORIENTATION_UNDEFINED:
        default:
            return bitmap;
        }
        try
        {
            Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            bitmap.recycle();
            return bmRotated;
        }
        catch (OutOfMemoryError e)
        {
            mLogger.e("OutOfMemoryError occured while rotating the image");
            return bitmap;
        }
    }

コンテンツプロバイダー:

コンテンツプロバイダーの実装では、AndroidのFileProviderを使用するか、以下のようなコンテンツプロバイダーを実装できます。このコンテンツプロバイダーは、カメラアプリが書き込むアプリコンテナー内のファイルを開きます。

public class AttachmentContentProvider extends ContentProvider 
{
    public static final String AUTHORITY = "com.yourcompany.yourapp.AttachmentContentProvider";
    public static final int ENTITY_ATTACHMENT = 1;
    public static final int ENTITY_ATTACHMENT_ID = 2;

    private static final UriMatcher sUriMatcher;
    static 
    {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        sUriMatcher.addURI(AUTHORITY, "images", ENTITY_ATTACHMENT);
        sUriMatcher.addURI(AUTHORITY, "images"+"/#", ENTITY_ATTACHMENT_ID);
    }

    @Override
    public boolean onCreate()
    {
        return true;
    }

    @Override
    public int delete(Uri uri, String where, String[] whereArgs)
    {
        return 0;
    }

    @Override
    public String getType(Uri uri)
    {
        int match = sUriMatcher.match(uri);
        switch (match) 
        {
        case ENTITY_ATTACHMENT:
        case ENTITY_ATTACHMENT_ID:
            return "image/jpeg";

        default:
            return null;
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues initialValues)
    {
        return null;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
    {
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String where, String[] whereArgs)
    {
        return 0;
    }

    public static File getAttachmentFile(String fileName)
    {
        String appfilesDir = context.getApplicationContext().getFilesDir().getAbsolutePath();
        String attachmentDirPath = appfilesDir + ('/') + "images");
        File newFile = new File(AttachmentHelper.getAttachmentsDir() + File.separator + fileName);
        newFile.getParentFile().mkdirs();
        return newFile;
    }


    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
    {
        long id = -1;
        try
        {
            id = ContentUris.parseId(uri);
        }
        catch (NumberFormatException e)
        {
            m_logger.e("Invalid id for Uri : " + uri );
        }

        String filename  = id + ".jpg"; // id will be IMG+current time millis
        File imageFile = getAttachmentFile(id); 
        return (ParcelFileDescriptor.open(file, parseMode(mode)));
    }
}

要約すると、このコードはテストされたほとんどのデバイスで動作し、必要に応じてカメラから受信した画像を修正します。

2
Rohan

ログに従って

_Caused by: Java.lang.NullPointerException: Attempt to invoke virtual method 'Java.lang.String Android.net.Uri.getScheme()' on a null object reference
_

NullオブジェクトでgetScheme()を呼び出していることを明確に示しています。そのため、処理する前に、nullインテントデータをチェックする必要があります。

また、Android Mでは、ユーザーにカメラの許可を求める必要があります。カメラの許可がないと、アプリがクラッシュします。

新しいアクセス許可アーキテクチャを使用する方法を知るには、次をご覧ください。 http://developer.Android.com/training/permissions/index.html

2
Geeky Singh

フラグメントのインテントを使用しており、getActivity()を使用している場合は、フラグメントをアクティビティにアタッチしていることを確認してください。そうしないと、nullポインターがスローされる可能性があります。したがって、私の場合は、コンテキストを取得するための回避策を使用しましたが、それを使用できます

gobal変数_View rootView_を作成し、OnViewCreated() methodを初期化すると、それに応じて使用できます。

_public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
    return;
}

if (requestCode == REQUEST_IMAGE_CAPTURE) {
Log.d(UploadPicturesFragment.class.getSimpleName(),
            "IMAGE URI NOT NULL: " + (mHighQualityImageUri == null));
    try {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap( rootView.getContext().getContentResolver(),
                mHighQualityImageUri);
        DroomUtil.beginCrop(mHighQualityImageUri, rootView.getContext(), this, true, bitmap.getWidth(),
                bitmap.getHeight());
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}}
_
0
Sunny Jain

これが私のプロジェクトでよく行うことです。ご覧ください。それが役に立てば幸い!

フラグメントクラス:

btnCapturePicture.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {       
        captureImage();     
    }
});

btnSelectPicture.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {       
        selectImage();
    }
});

...

private void captureImage() {
    mFileUri = Uri.fromFile(Utils.getOutputMediaFile(MEDIA_TYPE_IMAGE));
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri);
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
}

private void selectImage() {    
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType(MIME_IMAGE_ALL); 
    startActivityForResult(intent, SELECT_PHOTO_CODE);
}

...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    switch (requestCode) {
        case SELECT_PHOTO_CODE:
            if (resultCode == Activity.RESULT_OK) {
                mFileUri = imageReturnedIntent.getData();
                if (mFileUri != null) {
                    mFilePath = Utils.getRealPathFromUri(mContext, mFileUri);
                    mFilePath = mFilePath.replace("file://", "");
                    // do something such as display ImageView...
                }
            }
            break;
        case CAMERA_CAPTURE_IMAGE_REQUEST_CODE:
            if (resultCode == Activity.RESULT_OK) {
                if (mFileUri != null) {
                    mFilePath = mFileUri.toString();
                    mFilePath = mFilePath.replace("file://", "");
                    // do something such as display ImageView...
                }
            }
            break;
    }

    // refresh phone's folder content
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);     
        mediaScanIntent.setData(mFileUri);
        getActivity().sendBroadcast(mediaScanIntent);
    } else {
        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
    }
}

Utilsクラス:

//returning image, video
public static File getOutputMediaFile(int type) {

    // External sdcard location
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera");

    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    } else if (type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

//For select picture
public static String getRealPathFromUri(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Images.Media.DATA};
        cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}
0
BNK