在 Android 10 及更早期版本中,我们可以使用以下代码来启动相机意图,以拍摄照片并获取其完整尺寸:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 获取文件路径
File file = createImageFile();
Uri photoURI = FileProvider.getUriForFile(this, "com.example.fileprovider", file);
// 添加额外的参数,以便从意图接收完整尺寸图像
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
然而,在 Android 11 中,使用以上代码会导致我们只能收到缩略图,而不是完整尺寸的图像。为了解决这个问题,我们需要做以下修改:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 获取文件路径
File file = createImageFile();
Uri photoURI = FileProvider.getUriForFile(this, "com.example.fileprovider", file);
// 添加额外的参数,以便从意图接收完整尺寸图像
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
// 添加权限
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// 将相机意图发送给相机应用程序
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
} else {
Toast.makeText(this, "没有找到相机应用程序", Toast.LENGTH_SHORT).show();
}
我们添加了 FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION 权限,并使用 FileProvider 授权 URI 来访问文件。 需要注意的是,我们需要在 AndroidManifest.xml 文件中添加以下 provider 元素:
其中,@xml/file_paths 可以根据需要更改。最后,在 takePictureIntent 中添加 FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION,以便从