WSun
WSun

Reputation: 11

Call to system Camera returns null in fragment,but in activity it's ok

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
openCameraIntent.putExtra("return-data", true);
Uri imageUri = Uri.fromFile(new File(path));
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
activity.startActivityForResult(openCameraIntent, CROP);

The code is in a ImageView click handler. When the view is in an activity, it's ok. But when the view is in a fragment, the onActivityResult data is null

Upvotes: 0

Views: 711

Answers (2)

Shubhang Malviya
Shubhang Malviya

Reputation: 1635

Whenever you specified MediaStore.EXTRA_OUTPUT, the image taken will be written to that path, and no data will given to onActivityResult. You can read the image from what you specified.

Otherwise to get data from result callback write your intent without specifying the Output uri as

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CROP);

You can take a look at this answer also

Upvotes: 1

Harry Sharma
Harry Sharma

Reputation: 2200

            Intent intent = new Intent(
                                        MediaStore.ACTION_IMAGE_CAPTURE);

                                private Uri mImageCaptureUri = Uri.fromFile(new File(
                                        Environment
                                                .getExternalStorageDirectory(),
                                        "tmp_avatar_"
                                                + String.valueOf(System
                                                        .currentTimeMillis())
                                                + ".jpg"));

                                intent.putExtra(
                                        android.provider.MediaStore.EXTRA_OUTPUT,
                                        mImageCaptureUri);

                                try {


                                       intent.putExtra("return-data", true);

                                    startActivityForResult(intent,
                                            PICK_FROM_CAMERA);
                                } catch (ActivityNotFoundException e) {
                                    e.printStackTrace();
                                }

then on activityresult put

if(requestCode==PICK_FROM_CAMERA)
{

        doCrop();

}

 else if(requestCode==CROP_FROM_CAMERA)
  {

        Bundle extras = data.getExtras();

        Log.e("extras received from crop", extras.toString() + "yes yes");

        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");



        }

        File f = new File(mImageCaptureUri.getPath());

        if (f.exists())
            f.delete();


    }

here's do crop method

            private void doCrop() {

    final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();

    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setType("image/*");

    List<ResolveInfo> list = getActivity().getPackageManager()
            .queryIntentActivities(intent, 0);

    int size = list.size();

    if (size == 0) {
        Toast.makeText(getActivity(), "Can not find image crop app",
                Toast.LENGTH_SHORT).show();

        return;
    } else {
        intent.setData(mImageCaptureUri);

        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

        if (size == 1) {

            Intent i = new Intent(intent);
            ResolveInfo res = list.get(0);

            i.setComponent(new ComponentName(res.activityInfo.packageName,
                    res.activityInfo.name));

        startActivityForResult(i, CROP_FROM_CAMERA);
        } else {
            for (ResolveInfo res : list) {
                final CropOption co = new CropOption();

                co.title = getActivity().getPackageManager()
                        .getApplicationLabel(
                                res.activityInfo.applicationInfo);
                co.icon = getActivity().getPackageManager()
                        .getApplicationIcon(
                                res.activityInfo.applicationInfo);
                co.appIntent = new Intent(intent);

                co.appIntent
                        .setComponent(new ComponentName(
                                res.activityInfo.packageName,
                                res.activityInfo.name));

                cropOptions.add(co);
            }

            CropOptionAdapter adapter = new CropOptionAdapter(
                    getActivity(), cropOptions);

            AlertDialog.Builder builder = new AlertDialog.Builder(
                    getActivity());
            builder.setTitle("Choose Crop App");
            builder.setAdapter(adapter,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int item) {
                            startActivityForResult(
                                    cropOptions.get(item).appIntent,
                                    CROP_FROM_CAMERA);
                        }
                    });

            builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {

                    if (mImageCaptureUri != null) {
                        getActivity().getContentResolver().delete(
                                mImageCaptureUri, null, null);
                        mImageCaptureUri = null;
                    }
                }
            });

            AlertDialog alert = builder.create();

            alert.show();
        }
    }
}

Upvotes: 0

Related Questions