2010-07-18 5 views
5

Ich habe eine ziemlich einfache App, die die Kamera aus einem Menü startet. Die Kamera startet gut, aber wenn ich ok traf nach einer Aufnahme erhalte ich eine NPE auf meinem Nexus One:Ich bekomme eine NullPointerException, wenn ich ACTION_IMAGE_CAPTURE verwende, um ein Bild zu machen

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 

Code:

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

Antwort

6

Schaltet die Lager Kameraanwendung nicht aus EXTRA_OUTPUT senden, weshalb es null ist. Allerdings tun einige Kamera-Apps (wie der Held). Genial. Die Antwort ist also, EXTRA_OUTPUT anzugeben. Die nexus one camera App speichert das Bild an diesem Ort. Dann überprüfen Sie in onActivityResult(), ob die Absicht null ist. Wenn dies nicht der Fall ist, verwenden Sie data.getData(), und wenn dies der Fall ist, verwenden Sie den Speicherort in EXTRA_OUTPUT über eine Konstante und fügen Sie ihn in den Mediastore ein. Urgh.

+0

In onActivityResult(), wenn die Absicht null ist, dann, wie der ImagePath @sheridan – Abhi

+3

@nsheridan bekommen - Sorry, auf die Mühe zu machen Eine alte Frage, ich habe das gleiche Problem, aber ich werde wirklich verrückt, weil ich es nicht zur Arbeit bringen kann. Könnten Sie bitte etwas Code posten, um Ihre Lösung zu zeigen? – Matteo

3

Das ist wirklich scheint nicht wie eine Frage, mehr wie eine Tatsachenaussage. Wenn Sie fragen, was null ist, gibt es zwei Dinge, die null sein kann:

-Der Intent
'data' -Der Uri 'imageUri'

Haben Sie den Extra, 'EXTRA_OUTPUT' hinzuzufügen, zu die Absicht? Ist dies nicht der Fall, können Sie nur ein kleines Bild im Feld Extra abrufen. Und das scheint vielleicht deine NPE zu sein, die auf 'imageUri' passiert.

+0

Sie haben Recht, das ist nicht wirklich eine Frage. Hier ist meine Frage: Kann mir jemand helfen, herauszufinden, warum ich einen Npe mit Daten = null bekomme? Ich weiß, die Absicht ist null, der Stacktrace sagt mir: ResultInfo {Wer = Null, Anfrage = 0, Ergebnis = -1, Daten = Null} cameraIntent.putExtra (MediaStore.EXTRA_OUTPUT, tempPhotoUri); im obigen Code auch. Ich glaube, das ist richtig. – nsheridan

+0

Haben Sie diese andere Frage auf StackOverflow gesehen? http://stackoverflow.com/questions/1910608/android-action-image-capture-intent –

0

onActivityResult wird aufgerufen, wenn eine Aktivität, die Sie bereits gestartet haben, endet. Wenn Sie also eine Aktivität starten, die keine Daten sendet, liegt ein Problem vor.

1

Basierend auf der Lösung von nsheridan, habe ich gerade die fileUri, die ich in der Absicht hinzugefügt (intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri);) in der ganzen Klasse bekannt. In der ActivityResult() habe ich überprüft, ob die Absicht == null ist, wenn dies der Fall ist, wird die fileUri-Variable verwendet, anstatt zu versuchen, sie aus der intent.getData() zu entfernen.

Funktioniert gut für mich jetzt.

Verwandte Themen