【问题标题】:Android - The app is crashing when taking photo with custom camera appAndroid - 使用自定义相机应用拍照时应用崩溃
【发布时间】:2012-07-29 03:35:51
【问题描述】:

我正在尝试使用自定义相机应用拍照,但不幸的是,当调用 takePhoto() 方法时,我得到了 NullPointerException。

在这一行的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)

【问题讨论】:

  • 参见 TestCameraActivity.java 的第 131 行
  • 是的,这是导致 NPE 的行: Uri imageUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());但我不知道为什么。

标签: android android-layout android-intent android-emulator android-widget


【解决方案1】:

好的,原来new ContentValues()为null,所以我尝试用一​​些数据初始化它:

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");

【讨论】:

    【解决方案2】:

    试试这个..

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

    【讨论】:

    • 嗨,这会很好用,但这不是我想要的。我需要使用自定义相机应用程序拍照,而不是内置相机应用程序。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多