最近我写了一个 android 应用程序,它需要从内置相机中拍照并将其取回我的应用程序。我使用了许多教程之一,一切都很好。但后来我在不同的设备上测试了它,但没有任何效果。似乎有问题,所以我如何确保我可以在每台设备上拍照?(见我的回答,这更像是一个教程)
1 回答
我使用了许多教程之一,一切都很好。但后来我在不同的设备上测试了它,但没有任何效果。起初我很惊讶,但后来我决定更深入地研究这个话题。我意识到很多这些教程可能会导致一个大问题。所以我决定和你分享我的经验。
让我从大多数教程使用的常见方法开始。
首先,您选择类似这样的 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 函数并从接收到的意图数据中读取图片
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 文档中所写的,意图数据只会返回一个 sacled 或者可以说是拍摄照片的小版本,而某些设备根本不返回任何东西!甚至可能发生数据不为空但您收到“传递结果结果信息失败”异常的情况。
所以现在怎么办?解决方案非常简单。您只需告诉相机将图片保存到 SD 卡并返回此文件的 URI。下面,我将向您展示上面编辑过的代码。
我们创建一个静态 requestID和一个 URI
private static final int CAMERA_PIC_REQUEST = 1337;
private static Uri outputFileUri;
我们比创建相机活动,但这次我们传递了一个额外的参数(我们的 URI)
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
现在为了处理图像,我们使用与上面相同的方法,但我们使用我们的 URI 而不是使用意图数据
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 卡上,只需删除该文件即可。
谢谢阅读!