java.lang.RuntimeException: Unable to resume activ

2019-04-17 04:20发布

问题:

I am trying to use camera class in my app. I just want to click a picture and set on the imageview and then posting it on some url. Posting on url working fine but sometime problem occurs while clicking any picture and resuming back to same activity from where I am navigating to camera app. It works fine on HTC wildfire (2.2 version) but sometime gives exception (failure chance 1/25) but when i test it on Sony xperia miro or samsung tab (4.0 version) it gives same exception many times (failure chance 20/25). I am not getting where the problem exists because sometimes app runs smoothly without any exception but with 4.0 or above version it force closes many times but sometime works fine on it.

Exception is : java.lang.RuntimeException: Unable to resume activity {fable.eventippo/fable.eventippo.EventsIppoPaymentActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=tabHome, request=1, result=-1, data=Intent { dat=content://media/external/images/media/17271 }} to activity {fable.eventippo/fable.eventippo.EventsIppoPaymentActivity}: java.lang.ClassCastException: fable.eventippo.Home cannot be cast to fable.eventippo.AddEvent

Complete code is given here.

Button Onclick.

browse = (Button) findViewById(R.id.browse);
    browse.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            final CharSequence[] items = { "Camera", "Gallery" };
            AlertDialog.Builder builder = new AlertDialog.Builder(
                    getParent());
            builder.setTitle("Browse From");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    if (items[item] == "Camera") {
                        PackageManager pm = getPackageManager();

                        if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
                            Intent i = new Intent(
                                    android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

                            i.putExtra(MediaStore.EXTRA_OUTPUT,
                                    MyFileContentProviders.CONTENT_URI);

                            getParent().startActivityForResult(i,
                                    CAMERA_REQUEST);

                        } else {

                            Toast.makeText(getParent(),
                                    "Camera is not available",
                                    Toast.LENGTH_LONG).show();

                        }
                    } else if (items[item] == "Gallery") {
                        try {

                            Intent intent = new Intent();
                            intent.setType("image/*");
                            intent.setAction(Intent.ACTION_GET_CONTENT);
                            getParent().startActivityForResult(
                                    Intent.createChooser(intent,
                                            "Select Picture"),         PICK_IMAGE);
                        } catch (Exception e) {
                            Toast.makeText(getParent(), e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                            Log.e(e.getClass().getName(), e.getMessage(), e);
                        }

                    }
                }

            });
            AlertDialog alert = builder.create();
            alert.show();

        }
    });

On Activity Result:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Bundle bn = data.getExtras();
    switch (requestCode) {
    case PICK_IMAGE:
        if (resultCode == Activity.RESULT_OK) {
            Uri selectedImageUri = data.getData();
            String filepath = null;

            try {
                // OI FILE Manager
                String filemanagerstring = selectedImageUri.getPath();
                // MEDIA GALLERY
                String selectedImagePath = getPath(selectedImageUri);
                // logo.setImageURI(selectedImageUri);
                if (selectedImagePath != null) {
                    filepath = selectedImagePath;
                } else if (filemanagerstring != null) {
                    filepath = filemanagerstring;
                } else {
                    Toast.makeText(getApplicationContext(), "Unknown path",
                            Toast.LENGTH_LONG).show();
                    Log.e("Bitmap", "Unknown path");
                }
                if (filepath != null) {
                    // /upload.setText(filepath);
                    decodeFile(filepath);
                } else {
                    // filePath = null;
                    bitmap = null;
                }
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Internal error",
                        Toast.LENGTH_LONG).show();
                Log.e(e.getClass().getName(), e.getMessage(), e);
            }
        }
        break;
    case CAMERA_REQUEST:
        if (resultCode == Activity.RESULT_OK) {

            File out = new File(getFilesDir(), "newImage.jpg");

            if (!out.exists()) {

                Toast.makeText(getBaseContext(),

                "Error while capturing image", Toast.LENGTH_LONG)

                .show();

                return;

            }

            String filepath = out.getAbsolutePath().toString();
            decodeFile(filepath);

        }
        break;
    default:
    }

Complete Exception is shown on following image

If you need anything more please tell me.

Thanks in Advance

Waiting for answer

回答1:

Takepicture Button onClickListener:

TakePicture.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File file = new File(Environment.getExternalStorageDirectory().getPath(), "MyPic-"+ System.currentTimeMillis() + ".jpg");
            SelectedImage = Uri.fromFile(file);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, SelectedImage);
            startActivityForResult(intent,CAMERA_PIC_REQUEST);

        }
    });

Select From Gallery Button onClickListener:

SelectfromGallery.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

             Intent intent = new Intent();
             intent.setType("image/*");
             intent.setAction(Intent.ACTION_GET_CONTENT);
             startActivityForResult(Intent.createChooser(intent,"Select Picture"), RESULT_LOAD_IMAGE);

        }
    });

onActivityResult:

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

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {

        SelectedImage = data.getData();
        String filePath = null;

        try {
            // IO FILE Manager
            String filemanagerstring = SelectedImage.getPath();

            // MEDIA GALLERY
            String selectedImagePath = getPath(SelectedImage);

            if (selectedImagePath != null) {
                filePath = selectedImagePath;
            } else if (filemanagerstring != null) {
                filePath = filemanagerstring;
            } else {
                Toast.makeText(getApplicationContext(), "Unknown path",
                        Toast.LENGTH_LONG).show();
                Log.e("Bitmap", "Unknown path");
            }

            if (filePath != null) {
                decodeFile(filePath);   
            } else {
                bitmap = null;
            }
            FROM_GALLERY = true;

        } catch (Exception e) {
            Log.e("Uploaderror", e.getLocalizedMessage());
        }
    }
    else if(requestCode==CAMERA_PIC_REQUEST && resultCode == RESULT_OK){

        /*//SelectedImage = data.getData();
        Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
        ProfilePic.setImageBitmap(thumbnail);*/
        String filePath = null;
        try {
            // OI FILE Manager
            String filemanagerstring = SelectedImage.getPath();

            // MEDIA GALLERY
            String selectedImagePath = getPath(SelectedImage);

            if (selectedImagePath != null) {
                filePath = selectedImagePath;
            } else if (filemanagerstring != null) {
                filePath = filemanagerstring;
            } else {
                Toast.makeText(getApplicationContext(), "Unknown path",
                        Toast.LENGTH_LONG).show();
                Log.e("Bitmap", "Unknown path");
            }

            if (filePath != null) {
                decodeFile(filePath);
                FROM_GALLERY = false;
            } else {
                bitmap = null;
            }

        } catch (Exception e) {
            Log.e("error:", e.getLocalizedMessage());
        }

    }
    else if (resultCode == Activity.RESULT_CANCELED) 
      {
        Log.e("STATUS:", "Selecting picture cancelled"); 
      } 
}

decodeFile method:

   public void decodeFile(String filePath) {
    // Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, o);

    // The new size we want to scale to
    final int REQUIRED_SIZE = 1024;

    // Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    while (true) {
        if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE)
            break;
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    // Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    bitmap = BitmapFactory.decodeFile(filePath, o2);

    ProfilePic.setImageBitmap(bitmap);
}

here you go. My complete code to achieve that objective. I couldn't do thorough testing as i had limited devices. So, can't say for sure that this would work on all devices. if you find out a solution for your issue or if this code works then let me know. Thanks. Happy coding.