Obtengo una NullPointerException cuando uso ACTION_IMAGE_CAPTURE para tomar una foto

Tengo una aplicación bastante simple que inicia la cámara desde un menú. La cámara se inicia bien, pero cuando toco bien después de tomar una foto obtengo un NPE en mi nexo uno:

E/AndroidRuntime( 3891): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {net.asplode.tr/net.asplode.tr.PostImage}: java.lang.NullPointerException E/AndroidRuntime( 3891): at android.app.ActivityThread.deliverResults(ActivityThread.java:3515) E/AndroidRuntime( 3891): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3557) E/AndroidRuntime( 3891): at android.app.ActivityThread.access$2800(ActivityThread.java:125) E/AndroidRuntime( 3891): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2063) E/AndroidRuntime( 3891): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 3891): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 3891): at android.app.ActivityThread.main(ActivityThread.java:4627) E/AndroidRuntime( 3891): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 3891): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime( 3891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) E/AndroidRuntime( 3891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) E/AndroidRuntime( 3891): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime( 3891): Caused by: java.lang.NullPointerException E/AndroidRuntime( 3891): at net.asplode.tr.PostImage.onActivityResult(PostImage.java:92) E/AndroidRuntime( 3891): at android.app.Activity.dispatchActivityResult(Activity.java:3890) E/AndroidRuntime( 3891): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) E/AndroidRuntime( 3891): ... 11 more W/ActivityManager( 85): Force finishing activity net.asplode.tr/.PostImage 

Código:

 @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.mnuCamera) { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ContentValues values = new ContentValues(); values.put(Media.TITLE, "image"); Uri tempPhotoUri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempPhotoUri); startActivityForResult(cameraIntent, FROM_CAMERA); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; } Uri imageUri = data.getData(); Log.i("imageUri: ", imageUri.toString()); } 

Resulta que la aplicación de la cámara de valores no envía EXTRA_OUTPUT, razón por la cual es nula. Sin embargo, algunas aplicaciones de cámara (como el héroe) lo hacen. Increíble. Entonces la respuesta es especificar EXTRA_OUTPUT. La aplicación nexus one camera guardará la imagen en esa ubicación. Luego en onActivityResult () comprueba si el bash es nulo. Si no es así, use data.getData (), y si es así, utilice la ubicación específica en EXTRA_OUTPUT a través de una constante e insértelo en Mediastore. Urgh.

Esto realmente no parece una pregunta, más como una statement de hechos. Si está preguntando qué es nulo, hay dos cosas que pueden ser nulas:

-Los ‘datos’ de intención
-El Uri ‘imageUri’

¿Agregó el Extra, ‘EXTRA_OUTPUT’, al Intento? De lo contrario, solo podrá recuperar una imagen de tamaño pequeño en el campo Extra. Y esto parece ser quizás su NPE, que ocurre en ‘imageUri’.

http://developer.android.com/reference/android/provider/MediaStore.html#ACTION_IMAGE_CAPTURE

Basado en la solución de nsheridan, acabo de hacer el archivo Uri que agregué en el bash (intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri);) conocido en toda la clase. En ActivityResult (), verifiqué si la intención == null, si es así, se usa la variable fileUri en lugar de intentar sacarla de intent.getData ().

Funciona bien para mí ahora.

onActivityResult se invoca cuando finaliza cualquier actividad que ya hayas iniciado, por lo que si comienzas una actividad que no envía datos, habrá un problema.