Android - 使用自定义相机应用拍摄照片时,该应用崩溃
问题描述:
我正在尝试使用自定义相机应用拍照,但不幸的是,当takePhoto()
方法被调用时,我得到了NullPointerException
。Android - 使用自定义相机应用拍摄照片时,该应用崩溃
唯一的例外是在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)
答
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");
答
试试这个..
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
参见TestCameraActivity.java的第131行 – 2012-07-31 11:20:27
是的,这是导致NPE的行:Uri imageUri = getContentResolver()。insert(Media.EXTERNAL_CONTENT_URI,new ContentValues());但我不知道为什么。 – 2012-07-31 11:22:05