Android:从相机获取图片 - 小心

标签 android camera android-camera android-camera-intent

最近我编写了一个 Android 应用程序,它需要从内置相机拍摄照片并将其取回我的应用程序。我使用了众多教程中的一个,一切正常。但后来我在不同的设备上测试了它,但没有任何效果。似乎有问题,那么我如何确保我可以在每台设备上拍照? (看我的回答,这更像是一个教程)

最佳答案

我使用了众多教程中的一个,一切正常。但后来我在不同的设备上测试了它,但没有任何效果。起初我很惊讶,但后来我决定深入探讨这个话题。我意识到很多这样的教程会导致一个大问题。所以我决定与您分享我的经验。

让我从大多数教程使用的通用方法开始。

首先你选择一个像这样的requestID:

private static final int CAMERA_PIC_REQUEST = 1337;

然后你创建一个Intent并启动相机Activity

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

要取回图片,您可以使用 onActivityResult 函数并从接收到的 Intent 数据中读取图片

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK && data != null) {
        // do something like
       Bitmap bitmap = (Bitmap) data.getExtras().get("data");
    }
}

看起来不错吧?很好,但现在是棘手的部分。

如 android 文档中所写, Intent 数据只会返回一个 sacled down 或者可以说是拍摄照片的小版本,而某些设备根本不会返回任何东西!甚至可能发生数据不为空但您收到“传递结果 ResultInfo 失败”异常的情况。

那现在呢?解决方案非常简单。你只需告诉相机将图片保存到 SD 卡并返回一个 URI 到这个文件。下面,我将向您展示上面编辑的代码。

我们创建一个静态请求 ID 一个 URI

private static final int CAMERA_PIC_REQUEST = 1337;
private static Uri outputFileUri;

我们创建了相机 Activity ,但这次我们传递了一个额外的参数(我们的 URI)

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

现在我们使用与上面相同的方法来处理图像,但我们使用我们的 URI 而不是使用 Intent 数据

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_PIC_REQUEST && resultCode == RESULT_OK) {
            // do something to get the bitmap from the uri for example
          Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), outputFileUri);
}

使用此解决方案,您可以确保在每台设备上都能获得照片。但是要小心,因为您得到的是全尺寸位图,可能需要缩小位图以避免内存不足错误。如果您不想将照片保存在用户的 SD 卡上,只需删除该文件即可。

感谢阅读!

关于Android:从相机获取图片 - 小心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17303937/

相关文章:

android - 在不使用位图的情况下裁剪相机拍摄的图像

php - 如何使用 php 将字段值从服务器上托管的数据库传递到 Android 应用程序?

c++ - OpenCV 计算相机位置和旋转

安卓日期 : finding future date

c++ - 将帧速率提高到 30 fps 并从 AVT GigE 相机获取 bayerrg8

android - 相机 resultCode 返回 0

android - 如何制作假相机

Android decodeYUV420SP 导致绿色图像?

android - 在Android中使用YouTube视频自定义ListView

android - 整洁架构和身份验证。正确的方法?