onCreate called after onActivityResult when I pick picture from gallery

主宰稳场 提交于 2020-01-03 10:44:19

问题


I have 'SherlockFragmentActivity' with overrided 'onActivityResult'.

I try to get image from camera and gallery and crop it. The problem is I returned on my activity not fragment after onActivityResult called.

...
            FragmentTransaction t = fragmentManager.beginTransaction();
            LogInFragment logFrag = new LogInFragment();
            t.replace(R.id.fragment_container, logFrag);
            t.commit();
...
     @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
        }

Activity layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/fragment_container"
                android:background="@color/textWhite"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

</RelativeLayout>

And I also have 'SherlockFragment' where I picked image:

startImagePickerDialog(this);


public void startImagePickerDialog() {
        AlertDialog.Builder myAlertDialog = new AlertDialog.Builder(getSherlockActivity());
        myAlertDialog.setTitle("Upload Pictures Option");
        myAlertDialog.setMessage("How do you want to set your picture?");

        myAlertDialog.setPositiveButton("Gallery", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                Intent intent = new Intent();
                // call android default gallery
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                // ******** code for crop image
                intent.putExtra("crop", "true");
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("outputX", 200);
                intent.putExtra("outputY", 200);
                intent.putExtra("noFaceDetection", true);
                try {
                    intent.putExtra("return-data", true);
                    startActivityForResult(Intent.createChooser(intent,
                            "Complete action using"), Const.GALLERY_PICTURE);
                } catch (ActivityNotFoundException e) {
                    Log.e(LOG_TAG, "ActivityNotFoundException");
                }
            }
        });
        myAlertDialog.setNegativeButton("Camera", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1) {
                // call android default camera
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.putExtra(MediaStore.EXTRA_OUTPUT,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
                intent.putExtra("crop", "true");
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
                intent.putExtra("outputX", 200);
                intent.putExtra("outputY", 200);
                intent.putExtra("noFaceDetection", true);
                try {
                    intent.putExtra("return-data", true);
                    startActivityForResult(intent, Const.CAMERA_REQUEST);
                } catch (ActivityNotFoundException e) {
                    Log.e(LOG_TAG, "ActivityNotFoundException");
                }
            }
        });
        myAlertDialog.show();
    }

And 'onActivityResult' in 'SherlockFragment':

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(LOG_TAG, "onActivityResult");
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode != getSherlockActivity().RESULT_OK) {
            Log.e(LOG_TAG, "resultCode != RESULT_OK");
            return;
        }

        if (requestCode == Const.CAMERA_REQUEST) {
            Log.d(LOG_TAG, "requestCode == CAMERA_REQUEST");
            Bundle extras = data.getExtras();
            if (extras != null) {
                Log.d(LOG_TAG, "extras != null");
                Bitmap photo = extras.getParcelable("data");
                icon.setImageBitmap(photo);
            }
        }

        if (requestCode == Const.GALLERY_PICTURE) {
            Log.d(LOG_TAG, "requestCode == GALLERY_PICTURE");
            Bundle extras2 = data.getExtras();
            if (extras2 != null) {
                Log.d(LOG_TAG, "extras != null");
                Bitmap photo = extras2.getParcelable("data");
                icon.setImageBitmap(photo);
            }
        }
    }

UPDATE When I call camera activity my main activity call 'onSaveInstanceState' and after that 'onRestoreInstanceState'. Is it a reason?


回答1:


  1. Check your "Settings" -> "Developer options" -> "Don't keep activities" flag.
  2. This is the nature of android if your device needs memory it destroys activities which are not visible. So you have to consider that your activity can be recreated any time. BTW "Don't keep activities" option is there to simulate your application when your device needs memory and destroys your backstack activities.



回答2:


Try Like this

Change

Bitmap photo = extras.getParcelable("data");

To

Bitmap photo=(Bitmap) intent.getExtras().get("data");

Edited:-

@Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            Log.d(LOG_TAG, "onActivityResult");
            super.onActivityResult(requestCode, resultCode, data);

            if (resultCode != getSherlockActivity().RESULT_OK) {
                Log.e(LOG_TAG, "resultCode != RESULT_OK");
                return;
            }

            if (requestCode == Const.CAMERA_REQUEST) {
                Log.d(LOG_TAG, "requestCode == CAMERA_REQUEST");
                Bitmap photo=(Bitmap) intent.getExtras().get("data");// Changed Here
                icon.setImageBitmap(photo);

            }

            if (requestCode == Const.GALLERY_PICTURE) {
                Log.d(LOG_TAG, "requestCode == GALLERY_PICTURE");
               Uri imageUri= intent.getData();// Changed Here, or first decode the image to Avoid OutOfMemory Error
               icon.setImageURI(imageUri);
            }
        }



回答3:


Please replace

frag.startActivityForResult(...); 

In your fragment with

startActivityForResult(...)


来源:https://stackoverflow.com/questions/19688897/oncreate-called-after-onactivityresult-when-i-pick-picture-from-gallery

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!