ImagineThat ImagineThat - 3 months ago 83
Android Question

AlertDialog: Attempted to finish an input event but the input event receiver has already been disposed

When I press the "Choose Photo" button, the AlertDialog seems to cancel out and I get the following message in the logcat:

Attempted to finish an input event but the input event receiver has already been disposed


This was literally working last night and I don't recall making any changes pertaining to this function. Please help.

private void dispatchTakePictureIntent() {
final CharSequence[] options = {"Take Photo", "Choose from Gallery", "Cancel"};
final AlertDialog.Builder cameraChoice = new AlertDialog.Builder(Person2Screen.this);
cameraChoice.setTitle("Take/choose new photo");
cameraChoice.setItems(options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (options[which].equals("Take Photo")) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
//savePicture(cameraIntent);
if(id.equals(HAPPY_ID2))
startActivityForResult(cameraIntent, REQUEST_HAPPY_PHOTO);
if(id.equals(SURPRISED_ID2))
startActivityForResult(cameraIntent, REQUEST_SURPRISED_PHOTO);
if(id.equals(AFRAID_ID2))
startActivityForResult(cameraIntent, REQUEST_AFRAID_PHOTO);
if(id.equals(UPSET_ID2))
startActivityForResult(cameraIntent, REQUEST_UPSET_PHOTO);
if(id.equals(SAD_ID2))
startActivityForResult(cameraIntent, REQUEST_SAD_PHOTO);
} else if (options[which].equals("Choose Photo")) {
Intent galleryIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
if(id.equals(HAPPY_ID2))
startActivityForResult(galleryIntent, REQUEST_HAPPY_PHOTO);
else if(id.equals(SURPRISED_ID2))
startActivityForResult(galleryIntent, REQUEST_SURPRISED_PHOTO);
else if(id.equals(AFRAID_ID2))
startActivityForResult(galleryIntent, REQUEST_AFRAID_PHOTO);
else if(id.equals(UPSET_ID2))
startActivityForResult(galleryIntent, REQUEST_UPSET_PHOTO);
else if(id.equals(SAD_ID2))
startActivityForResult(galleryIntent, REQUEST_SAD_PHOTO);
} else if (options[which].equals("Cancel")) {
dialog.dismiss();
}
}
});
final CharSequence[] pictureNumbers = {"Picture 1", "Picture 2", "Picture 3", "Reinforcer"};
AlertDialog.Builder selectPhotoNumber = new AlertDialog.Builder(Person2Screen.this);
selectPhotoNumber.setTitle("Which picture would you like to set/change?");
selectPhotoNumber.setItems(pictureNumbers, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (pictureNumbers[which].equals("Picture 1")) {
index = 1;
cameraChoice.show();
} else if (pictureNumbers[which].equals("Picture 2")) {
index = 2;
cameraChoice.show();
} else if (pictureNumbers[which].equals("Picture 3")) {
index = 3;
cameraChoice.show();
} else if (pictureNumbers[which].equals("Reinforcer")) {
index = 4;
cameraChoice.show();
}
}
});
selectPhotoNumber.show();
}

Answer

I should've have noticed this way too earlier but, I guess you posted your earlier code correctly. The current issue is that we are trying to match "Choose from Gallery" with "Choose Photo" which would always be false. So, we need to correct that. I also refactored your code a bit:

private void dispatchTakePictureIntent() { 
    final CharSequence[] options = {"Take Photo", "Choose from Gallery", "Cancel"};
    final AlertDialog.Builder cameraChoice = new AlertDialog.Builder(Person2Screen.this);
    cameraChoice.setTitle("Take/choose new photo");
    cameraChoice.setItems(options, new DialogInterface.OnClickListener() {
        @Override 
        public void onClick(DialogInterface dialog, int which) {
            if (options[which].equals("Cancel")) {
                dialog.dismiss();
            } else {
                Intent intent;
                int requestCode;

                if (options[which].equals("Take Photo")) {
                     intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                } else { // from doc
                     intent = = new Intent(Intent.ACTION_OPEN_DOCUMENT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                }

                switch (id) {
                     case HAPPY_ID2:
                         requestCode = REQUEST_HAPPY_PHOTO;
                         break;
                     case SURPRISED_ID2:
                         requestCode = REQUEST_SURPRISED_PHOTO;
                         break;
                     case AFRAID_ID2:
                         requestCode = REQUEST_AFRAID_PHOTO;
                         break;
                     case UPSET_ID2:
                         requestCode = REQUEST_UPSET_PHOTO;
                         break;
                     default: // SAD_ID
                         requestCode = REQUEST_SAD_PHOTO;
                         break;
                }

                startActivitForResult(intent, requestCode);
            }
        } 
    });