相机图像捕获不会返回数据 - 在某些设备上

时间:2015-04-21 16:48:56

标签: android android-camera-intent

我已经开始在Moto E2上测试我的应用程序,这是标记上的第一批Android Lollipop设备之一。事实证明,我出乎意料地使用相机无法捕捉图像。我无法收到照片。

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

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

返回我的活动后,Intent不包含任何数据,即data.getData()返回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:
        (...)
    }
}

在运行Android 5.0.2的Moto E2上: enter image description here

现在有很多关于SO的问题,其中有类似的问题和各种不同的原因。这里让我感到困惑的是,这个代码在运行KitKat和Jelly Bean的其他Android设备上运行得很好(见下文)。 这种行为可能是什么原因,我该如何解决?

在运行Android 4.4.2的Galaxy S4 mini上: enter image description here

3 个答案:

答案 0 :(得分: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()中获取文件。

这将返回一个完整大小图像的路径,而不是data参数,它返回一个缩略图。

答案 1 :(得分:2)

我也遇到了不同制造商和Android版本的不同Android设备上相机意图的一些问题(请参阅此处的原始帖子: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

答案 2 :(得分:1)

Android 5.0有一些额外的过滤来处理Intent。因此,您可能必须以这种方式处理它。您可以尝试在Camera API for 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