2014-09-24 156 views
3

我正在使用一个按钮,它将调用设备摄像头。Android摄像头:捕获图像数据时意图返回null

private void captureImage() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    fileUri = getOutputMediaFileUri(ImageUtils.MEDIA_TYPE_IMAGE); 

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    // start the image capture Intent 
    startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 
} 

public Uri getOutputMediaFileUri(int type) { 
    item = ImageUtils.getOutputMediaFile(type, getActivity()); 

    return item.getIcon(); 
} 

和getOutputMediaFile()方法是,

public static ImageItem getOutputMediaFile(int type, Activity activity) { 

    // External sdcard location 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " 
        + IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    Date date = new Date(); 
    String timeStamp = CommonUtils.dateToString(date, "yyyyMMddHHmmss"); 
    String dateString = CommonUtils.dateToString(date, 
      "yyyy/MM/dd HH:mm:ss"); 

    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 
    } 

    else { 
     return null; 
    } 

    ImageItem item = new ImageItem(); 
    item.setId(timeStamp); 
    item.setmIcon(Uri.fromFile(mediaFile)); 
    item.setDate(dateString); 
    item.setmSpans(1); 

    // save image in on activity result 

    return item; 
} 

上相同的活性我呼吁图像结果的OnActivityResult方法,

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE 
      && resultCode == RESULT_OK) { 

     String[] fileColumn = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = getActivity().getContentResolver().query(fileUri, 
       fileColumn, null, null, null); 
     String contentPath = null; 
     if (cursor.moveToFirst()) { 
      contentPath = cursor.getString(cursor 
        .getColumnIndex(fileColumn[0])); 

      horseImage.setImageBitmap(ImageManager 
        .getImage(new ImageManagerRequest(contentPath))); 

     } else if (resultCode == RESULT_CANCELED) { 
      Toast.makeText(getActivity(), "Capture Cancelled", 
        Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getActivity(), "Capture failed", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

} 

当运行此代码我得到了以下错误日志。

09-24 19:17:10.250: E/AndroidRuntime(16995): FATAL EXCEPTION: main 
09-24 19:17:10.250: E/AndroidRuntime(16995): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=198496, result=-1, data=null} to activity {com.eyepax.horseapp/com.eyepax.horseapp.ui.activities.MainActivity}: java.lang.NullPointerException 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.deliverResults(ActivityThread.java:3141) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.access$1100(ActivityThread.java:130) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.os.Looper.loop(Looper.java:137) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.main(ActivityThread.java:4745) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at java.lang.reflect.Method.invokeNative(Native Method) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at java.lang.reflect.Method.invoke(Method.java:511) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at dalvik.system.NativeStart.main(Native Method) 
09-24 19:17:10.250: E/AndroidRuntime(16995): Caused by: java.lang.NullPointerException 
09-24 19:17:10.250: E/AndroidRuntime(16995): at com.eyepax.horseapp.ui.activities.AddHorseBasicInfo.onActivityResult(AddHorseBasicInfo.java:270) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:167) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.Activity.dispatchActivityResult(Activity.java:5192) 
09-24 19:17:10.250: E/AndroidRuntime(16995): at android.app.ActivityThread.deliverResults(ActivityThread.java:3137) 
09-24 19:17:10.250: E/AndroidRuntime(16995): ... 11 more 

fileUri是一个全局变量。我经历了很多例子,但我无法解决我的问题。很多例子都是因为Intent数据变为null而导致这种情况发生的。然后我改变了onActivityResult,如下所示,然后它就是逃脱。

if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == RESULT_OK 
      && null != data) {} 

帮我解决了这个问题。

+0

如果任何人有任何其他解决方案来识别哪里是错误 – user3800832 2014-09-25 03:48:39

回答

0

图像的URI应该在onActivityResult

包含在data.getData()在一个旧的项目,我也用这个:

public static Uri getLastPhoto(Context context) { 
    String[] columns = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_ADDED}; 

    ContentResolver cr = context.getContentResolver(); 
    Cursor cursor = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, 
      MediaStore.MediaColumns.DATE_ADDED + " DESC"); 

    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    String path = cursor.getString(columnIndex); 

    cursor.close(); 

    return Uri.fromFile(new File(path)); 
} 
+0

但数据变为空。 – user3800832 2014-09-24 14:14:53

+0

所以使用我的函数getLastPhoto – 2014-09-24 14:23:30

0

这发生在许多设备。它由于一些操作系统问题。如果您传递要保存的图像的名称,那么它更好,并使用该名称进行检索。

capturedImagePath = MyApplication.cameraImageDirectory + "/camera" 
       + num + ".png"; 
     File mFileTemp = new File(capturedImagePath); 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     try { 
      Uri mImageCaptureUri = null; 
      String state = Environment.getExternalStorageState(); 
      mImageCaptureUri = Uri.fromFile(mFileTemp); 
      intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, 
        mImageCaptureUri); 
      intent.putExtra("return-data", true); //$NON-NLS-1$ 
      startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE); 
     } catch (ActivityNotFoundException e) { 

      Log.d("camera fieldtip", "cannot take picture", e); //$NON-NLS-1$ 
     }