相机图像捕获没有 Return 数据 - 在某些设备上

Camera Image Capture Does Not Return Data - on Some Device(s)

我已经开始在 Moto E2 上测试我的应用程序,它是第一个 Android Lollipop 设备之一。原来我 用相机 捕捉图像时出乎意料地遇到了问题。我收不到照片。

使用以下方法创建图像捕获意图:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, PICK_FROM_CAMERA);

返回到我的 activity 后,Intent 不包含任何数据,即 data.getData() returns null。

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

    if (resultCode != RESULT_OK) return;

    switch(requestCode) {
        case PICK_FROM_CAMERA:
        (...)
    }
}

Moto E2 运行 Android 5.0.2:

现在这里有大量关于 SO 的问题,它们具有相似的问题和各种不同的原因。真正让我困惑的是这段代码在我的其他 Android 设备 运行 KitKat 和 Jelly Bean 上工作得很好(见下文)。 此行为的原因可能是什么,我该如何解决?

在 Galaxy S4 mini 运行 Android 4.4.2 上:

问题可以按照上面 Jibran Khan 的评论解决(摘自 https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent 的 Android 文档)。

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    // Create the File where the photo should go
    File photoFile = null;
    try {
        photoFile = createImageFile();
    } catch (IOException ex) {
        // Error occurred while creating the File
        ...
    }
    // Continue only if the File was successfully created
    if (photoFile != null) {
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photoFile));
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
    }
}

String mCurrentPhotoPath;

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
        imageFileName,  /* prefix */
        ".jpg",         /* suffix */
        storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    return image;
}

其中 mCurrentPhotoPath 可用于提取 onActivityResult() 中的文件。

这个 returns 全尺寸图像的路径与 data 参数相反,returns 一个缩略图。

Android 5.0 有一些额外的过滤来处理 Intent。因此,您可能必须以这种方式处理它。您可以尝试一下,因为它已在相机 API 中更改为 5.0

这里有一部分

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    }
}

可以在 Android 5.0 API 更改的文档中找到更多详细信息。

https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent

我在不同制造商和 Android 版本的不同 Android 设备上也遇到了一些相机意图问题(请在此处查看原始 post:Summary: Take a picture utilizing Camera Intent and display the photo with correct orientation (works on hopefully all devices)

我在 github 上发布了我的代码: https://github.com/ralfgehrer/AndroidCameraUtil