【问题标题】:Android Camera : when capturing image data intent returns nullAndroid相机:捕获图像数据意图时返回null
【发布时间】:2014-11-19 01:47:24
【问题描述】:

我正在使用一个按钮来调用设备摄像头。

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 数据为空,因此发生这种情况的许多示例。然后我将 onActivityResult 更改如下,但随后它就转义了。

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

帮我解决这个问题。

【问题讨论】:

  • 如果有人有任何其他解决方案来确定错误在哪里

标签: android android-intent onactivityresult


【解决方案1】:

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

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$
        }

【讨论】:

    【解决方案2】:

    图片的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));
    }
    

    【讨论】:

    • 但数据为空。
    • 所以使用我的函数getLastPhoto
    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多