Ответ 1
Несмотря на то, что текущий фрагмент кода является опрятным способом представления вариантов на выбор, я обнаружил, что с ним трудно справиться. По крайней мере, в моем случае это было так. Мне нужно сохранить изображения, снятые с камеры, для дальнейшей обработки в SDK Aviary (если пользователь так выбирает).
С этой целью я хотел бы предложить обходное решение.
Это не касается вашего вопроса как такового. Но предлагает альтернативу, учитывая, что вам нужно знать, откуда приходит изображение (Камера/Галерея).
AlertDialog.Builder builder = new AlertDialog.Builder(StatusUpdate.this);
builder.setTitle("Choose Image Source");
builder.setItems(new CharSequence[] {"Gallery", "Camera"},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
// GET IMAGE FROM THE GALLERY
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
Intent chooser = Intent.createChooser(intent, "Choose a Picture");
startActivityForResult(chooser, ACTION_REQUEST_GALLERY);
break;
case 1:
Intent getCameraImage = new Intent("android.media.action.IMAGE_CAPTURE");
File cameraFolder;
if (android.os.Environment.getExternalStorageState().equals
(android.os.Environment.MEDIA_MOUNTED))
cameraFolder = new File(android.os.Environment.getExternalStorageDirectory(),
"some_directory_to_save_images/");
else
cameraFolder= StatusUpdate.this.getCacheDir();
if(!cameraFolder.exists())
cameraFolder.mkdirs();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
String timeStamp = dateFormat.format(new Date());
String imageFileName = "picture_" + timeStamp + ".jpg";
File photo = new File(Environment.getExternalStorageDirectory(),
"some_directory_to_save_images/" + imageFileName);
getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
initialURI = Uri.fromFile(photo);
startActivityForResult(getCameraImage, ACTION_REQUEST_CAMERA);
break;
default:
break;
}
}
});
builder.show();
Это результат (я все еще утверждаю, что код дает намного лучший набор выбора, но опять же, не самый простой в вашем случае использования или в моем):
Теперь вы можете обработать результат на основе источника выделения:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case ACTION_REQUEST_GALLERY:
break;
case ACTION_REQUEST_CAMERA:
break;
}
}
};
ОБНОВЛЕНО:
Нашел! Существует ответ здесь, на SO, который точно определяет, что вам нужно. Это все-таки "обходное решение" *. В том смысле, что он не полагается на разные requestCodes
. Но тем не менее работает.
Странно я пропустил это, когда я застрял в этом.: - (
ПРИМЕЧАНИЕ: Я не размещаю код здесь и вместо этого ссылаюсь на него. Все реквизиты идут к оригинальному автору.: -)