2010-07-18 12 views
5

Tengo una aplicación bastante simple que inicia la cámara desde un menú. La cámara pone en marcha muy bien, pero cuando me golpeó bien después de tomar una foto que conseguir un NPE en mi Nexus One:Obtengo una NullPointerException cuando uso ACTION_IMAGE_CAPTURE para tomar una foto

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()); 
} 

Respuesta

6

Resulta que la aplicación de la cámara no envía EXTRA_OUTPUT, que es por eso que es nulo. 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 intento 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.

+0

En onActivityResult() si la intención es nula, entonces cómo obtener el imagepath @nsheridan – Abhi

+3

@nsheridan - Perdón por molestar en una vieja pregunta, estoy teniendo el mismo problema pero realmente me estoy volviendo loco porque no puedo hacer que funcione. ¿Podría publicar algún código para mostrar su solución? THKS por adelantado ... – Matteo

3

Esto en realidad no parecer una pregunta, más como una declaración de hechos. Si se está preguntando ¿cuál es nula, hay dos cosas que pueden ser nula:

-Los datos '' Intención
-La Uri 'imageUri'

usted añadió el extra, 'EXTRA_OUTPUT', a el 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'.

+0

Tienes razón, eso no es realmente una pregunta. Aquí está mi pregunta: ¿alguien me puede ayudar a identificar por qué estoy recibiendo una npe con data = null? Sé que la intención es nula, stacktrace me dice: ResultInfo {who = null, request = 0, result = -1, data = null} Tengo cameraIntent.putExtra (MediaStore.EXTRA_OUTPUT, tempPhotoUri); en el código anterior también. Creo que esto es correcto. – nsheridan

+0

¿Viste esta otra pregunta en StackOverflow? http://stackoverflow.com/questions/1910608/android-action-image-capture-intent –

0

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

1

Basado en la solución de nsheridan, acabo de hacer el archivo Uri que agregué con la intención (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.

Cuestiones relacionadas