2015-03-13 3 views
0

, так что это работало прекрасно до вчерашнего дня, когда я обновил свой телефон до 5.0.0 и протестировал приложение в эмуляторе 5.0.0. В основном цель состоит в том, чтобы позволить пользователю сделать снимок, вернуть его, открыть его, чтобы разрешить обрезку, а затем вернуть его и установить в качестве изображения.onActivityResult от камеры дает нулевое намерение

Все прошло нормально, но теперь цель onActivityResult равна нулю.

Вот код:

public void takeDisplayPicture(View view) { 

    final String TAKE_DISPLAY_PICTURE = "Take Display Picture"; 

    Log.d(TAKE_DISPLAY_PICTURE, "Clicked"); 

    try { 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(intent, CAMERA_CAPTURE); 

    } catch (ActivityNotFoundException e) { 

     String msg = "Your device doesn't support a camera!"; 

     Toast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT); 
     toast.show(); 

    } 

} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    final String RETURN_DISPLAY_PICTURE = "Return Display Picture"; 

    Log.d(RETURN_DISPLAY_PICTURE, "Returned"); 

    if (resultCode == RESULT_OK && requestCode == CAMERA_CAPTURE) { 

     picUri = data.getData(); 
     performCrop(picUri); 

    } else if (requestCode == PIC_CROP) { 

     Bundle extras = data.getExtras(); 
     bitmap = extras.getParcelable("data"); 
     displayPicture.setImageBitmap(bitmap); 

    } 

} 

private void performCrop(Uri picUri) { 

    try { 

     Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
     cropIntent.setDataAndType(picUri, "image/*"); 
     cropIntent.putExtra("crop", "true"); 
     cropIntent.putExtra("aspectX", 1); 
     cropIntent.putExtra("aspectY", 1); 
     cropIntent.putExtra("outputX", 256); 
     cropIntent.putExtra("outputY", 256); 
     cropIntent.putExtra("return-data", true); 
     startActivityForResult(cropIntent, PIC_CROP); 

    } catch (ActivityNotFoundException e) { 

     String msg = "Your device doesn't support the crop action!"; 
     Toast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT); 
     toast.show(); 

    } 

} 

ответ

1

Во-первых, Android does not have a CROPIntent.

В отношении nullUri предполагается, что это должно быть null. Цитирование the ACTION_IMAGE_CAPTURE documentation:

Вызывающий может передать дополнительный EXTRA_OUTPUT, чтобы контролировать, где будет записываться это изображение. Если EXTRA_OUTPUT не присутствует, изображение небольшого размера возвращается в качестве объекта Bitmap в дополнительное поле.

Вы не EXTRA_OUTPUT, и поэтому вы должны получить изображение с помощью плохо документированы (Bitmap)data.getExtras().get("data");.

+0

Было бы более полезным делать EXTRA_OUTPUT, а затем относительно кода в целом? Что касается намерения CROP, почему это работает с 4.0, а не с 5.0? Какова работа вокруг/другой метод выполнения урожая? –

+1

@AlexKnight: «Было бы более полезно делать EXTRA_OUTPUT, а затем в отношении кода в целом?» - если вы хотите полноразмерные изображения, это ваш единственный вариант. Если все, что вам нужно, это миниатюра, то ваш текущий код в порядке, кроме ожиданий 'Uri'. «Почему это работает на 4.0, а не 5.0?» - возможно, приложение камеры изменилось. Никто не имеет никакого смысла полагаться на недокументированные вещи, подобные этому действию «Intent», так как не требуется, чтобы все приложения камеры (предустановленные, установленные из Play Маркета и т. Д.) Предлагали это действие. – CommonsWare

+0

@AlexKnight: «Что такое работа вокруг/другой метод выполнения урожая?» - прочитайте сообщение в блоге, которое я связал в своем вопросе, для ссылок на некоторые библиотеки. Или посмотрите [эту категорию Android Arsenal] (http://android-arsenal.com/tag/45). – CommonsWare