2010-07-18 15 views
5

Kamerayı menüden başlatan oldukça basit bir uygulama var. Kamera ince başlattı, ama ben bir resim çektikten sonra Tamam vurduğunda benim nexus tek bir NPE olsun:Fotoğraf çekmek için ACTION_IMAGE_CAPTURE özelliğini kullandığımda NullPointerException alıyorum

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 

Kodu:

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

cevap

6

Null yüzden EXTRA_OUTPUT, göndermez stok kamera uygulamasını ortaya çıktı. Ancak, bazı kamera uygulamaları (kahraman gibi) yapar. Muhteşem. Yani cevap, EXTRA_OUTPUT değerini belirtmektir. Nexus one camera uygulaması, görüntüyü o konuma kaydedecektir. Ardından, onActivityResult() öğesinde, niyetin boş olup olmadığını kontrol edin. Değilse, data.getData() yöntemini kullanın ve sonra EXTRA_OUTPUT içinde belirli bir konumu sabit kullanarak kullanın ve bunu Mediastore'a yerleştirin. Urgh. Daha önce başlattığınız herhangi bir etkinlik sona erdiğinde, bu nedenle, veri göndermeyen bir etkinlik başlatırsanız, bir sorun olacaksa,

+0

Niyet boşsa onActivityResult() öğesinde, o zaman nasıl imagepath @nsheridan olsun – Abhi

+3

@nsheridan - Rahatsız ettiğim için üzgünüz eski bir soru, aynı sorunu yaşıyorum ama gerçekten deliriyorum çünkü işe yaramayacağım. Lütfen çözümünüzü göstermek için bazı kodlar gönderebilir misiniz? – Matteo

3

Bu gerçekten bir soru gibi görünmüyor, daha bir olgusal ifade gibi. Eğer boş olanı soruyorsan, iki boş olabilir şey vardır:

-The Niyet 'veri'
-The Uri 'imageUri'

sen Ekstra, 'EXTRA_OUTPUT' eklediniz mi, hiç niyet? Değilse, sadece Ekstra alanda küçük boyutlu bir görüntü alabileceksiniz. Ve bu belki de 'imageUri' üzerinde gerçekleşen NPE'niz olabilir.

+0

Haklısınız, bu gerçekten bir soru değil. İşte sorum şu: neden veri ile npe elde ettiğimi anlayabilmemde bana yardımcı olabilir = null? Niyetin null olduğunu biliyorum, stacktrace bana söyler: ResultInfo {who = null, request = 0, sonuç = -1, data = null} cameraIntent.putExtra (MediaStore.EXTRA_OUTPUT, tempPhotoUri); Yukarıdaki kodda da. Bunun doğru olduğuna inanıyorum. – nsheridan

+0

StackOverflow'da başka bir soru gördün mü? http://stackoverflow.com/questions/1910608/android-action-image-capture-intent –

1

nsheridan'ın çözümüne dayanarak, sınıf boyunca bilinen niyet (intent.putExtra (MediaStore.EXTRA_OUTPUT, fileUri);) eklediğim dosyayı yaptım. ActivityResult() içinde, intent == null olup olmadığını kontrol ettim, eğer öyleyse, fileUri değişkeni intent.getData() 'dan çıkarmaya çalışmak yerine kullanılır.

Şimdi benim için iyi çalışıyor.

İlgili konular