安卓相机 : when capturing image data intent returns null

标签 android android-intent onactivityresult

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

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

在同一个 Activity 中,我为图像结果调用了 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) {}

帮我解决这个问题。

最佳答案

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

关于安卓相机 : when capturing image data intent returns null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26019066/

相关文章:

android - 像 Instagram 这样的圆形背景文本,ReplacementSpan 不能按要求工作

java - 谷歌地图不显示

java - Android targetSdkVersion : accessing higher features, 和风险

android - 在 android 中使用 android 内置应用程序录制音频 30 秒

java - 如何在暂停时重新启动整个应用程序?

android - 无法从 ZXing 条码扫描仪获取结果

java - 图片上传不适用于小米手机

android - startActivityforResult 的 RequestCode 类型

android - 在 Android 中使用 android plaid sdk 未收到成功回调

android - 图像共享 Intent 适用于 Gmail,但会导致 FB 和 twitter 崩溃