-1

我正在嘗試使用自定義相機應用拍照,但不幸的是,當takePhoto()方法被調用時,我得到了NullPointerExceptionAndroid - 使用自定義相機應用拍攝照片時,該應用崩潰

唯一的例外是在onPictureTaken()回調扔在這條線:

Uri imageUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); 

不過,現在我得到另一個NPE:

07-31 14:59:38.117: W/System.err(22224): java.lang.NullPointerException 
07-31 14:59:38.156: W/System.err(22224): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:467) 
07-31 14:59:38.156: W/System.err(22224): at android.content.ContentResolver.openOutputStream(ContentResolver.java:363) 
07-31 14:59:38.156: W/System.err(22224): at android.content.ContentResolver.openOutputStream(ContentResolver.java:339) 
07-31 14:59:38.156: W/System.err(22224): at com.testcamera.TestCameraActivity.onPictureTaken(TestCameraActivity.java:154) 

這是我如何設置監聽器:

@Override 
public void onClick(View v) { 
    camera.takePicture(null, null, this); 
} 

而這裏的onPictureTaken回調:

@Override 
public void onPictureTaken(byte[] data, Camera camera) { 
    Uri imageUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues()); 
    try{ 
     OutputStream imageOS=getContentResolver().openOutputStream(imageUri); 
     imageOS.write(data); 
     imageOS.flush(); 
     imageOS.close(); 
    }catch (Exception e) { 
     e.printStackTrace(); 
    } 

    camera.startPreview(); 
} 

logcat的細節:

07-31 14:05:46.409: E/AndroidRuntime(2242): java.lang.NullPointerException 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.os.Parcel.readException(Parcel.java:1328) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.content.ContentProviderProxy.insert(ContentProviderNative.java:408) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.content.ContentResolver.insert(ContentResolver.java:604) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at com.testcamera.TestCameraActivity.onPictureTaken(TestCameraActivity.java:131) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.hardware.Camera$EventHandler.handleMessage(Camera.java:571) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.os.Looper.loop(Looper.java:130) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
07-31 14:05:46.409: E/AndroidRuntime(2242):  at dalvik.system.NativeStart.main(Native Method) 
+0

參見TestCameraActivity.java的第131行 – 2012-07-31 11:20:27

+0

是的,這是導致NPE的行:Uri imageUri = getContentResolver()。insert(Media.EXTERNAL_CONTENT_URI,new ContentValues());但我不知道爲什麼。 – 2012-07-31 11:22:05

回答

0

OK,原來這個new ContentValues()爲空,所以我試圖初始化它帶有一些數據:

ContentValues values=new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, data); 
values.put(MediaStore.MediaColumns.TITLE, "abc"); 
values.put(MediaStore.MediaColumns.SIZE, data.length); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); 
-1

試試這個..

button.setOnClickListener(new OnClickListener() 
     { 

      public void onClick(View v) 
      { 

       takePhoto(); 
      } 

     }); 


private void takePhoto(){ 
     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, CAMERA_REQUEST); 

    } 



protected void onActivityResult(int requestCode, int resultcode, Intent intent) 
    { 
     super.onActivityResult(requestCode, resultcode, intent); 

    if (requestCode == CAMERA_REQUEST) { 
     Bitmap photo = (Bitmap) intent.getExtras().get("data"); 
     } 

     else 
     { 
      Log.d("Status:", "Photopicker canceled");   
     } 
    } 
+0

嗨,這會很好,但這不是我要找的。我需要使用Custom Camera App拍攝照片,而不是內置的相機應用程序。 無論如何,謝謝。 – 2012-07-31 11:54:16

相關問題