gpt4 book ai didi

android - 执行 ACTION_IMAGE_CAPTURE Intent 的可靠方法?

转载 作者:行者123 更新时间:2023-11-29 19:44:25 25 4
gpt4 key购买 nike

在 Android 上执行 ACTION_IMAGE_CATPURE Intent 的最可靠方法是什么?我尝试了多种在网上找到的方法,但没有一种方法适用于所有设备。我的测试设备是 Nexus 6 (Android 6.0.1) 和联想手机 (4.4.2)。

我已经尝试了以下(删除了权限等冗余代码 - 这些显然工作正常):

选项 A(仅适用于 Nexus 6)

final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator);
root.mkdirs();
final String fname = "img_" + System.currentTimeMillis() + ".jpg";
outputFileUri = Uri.fromFile(new File(root, fname));

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePhotoIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, outputFileUri);

try {
startActivityForResult(takePhotoIntent, 1);
} catch (SecurityException e) { }

// ....

public void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println(new File(outputFileUri.toString()).exists()));
// This prints false on Kitkat, but true on 6.0

选项 B(对两者都不起作用,但似乎应该对两者都起作用)

Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
outputFileUri = takePhotoIntent.getData();
// start intent

// .....

public void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println(new File(outputFileUri.toString()).exists()));
// This prints false on everything

似乎应该是跨 Android 版本执行此操作的可靠方法,但过去一个小时我一直处于堆栈溢出状态,我尝试了 10 多种解决方案,并且它们都不适用于旧版 Android。

我如何可靠地从 ACTION_IMAGE_CAPTURE Intent 中获取 Uri?

最佳答案

// This prints false on Kitkat, but true on 6.0

这应该会在所有版本的 Android 上失败。 outputFileUri.toString() 将类似于 "file:///..."(对于 ... 的某些值),那不是有效的文件系统路径。也许 Google 更新了 File 来处理剥离方案。

更好的解决方案是保留 new File(root, fname),这是正确的 File 对象。请记住,当相机应用程序处于前台时,您的进程可能会终止,因此请在保存的实例状态 Bundle 中保留它。

另请记住,一旦您的 targetSdkVersion 为 24 或更高,您的方法将不适用于 API 级别 24+,如 file Uri values are banned .

but seems that it should work on both

The documentation没有声明 ACTION_IMAGE_CAPTURE 将返回任何内容,更不用说 Uri 了。我同意这在逻辑上应该是答案,但 Android 中有很多东西违反逻辑。

It seems like there should be a reliable way to do this across Android versions

好吧,期望从 ACTION_IMAGE_CAPTURE 中得到可靠的结果是愚蠢的。您正在委托(delegate)给第三方应用程序。 Android 设备型号有数千种,而这些型号附带了数百种相机应用程序。 Play 商店和其他地方还有数百个。许多相机应用程序开发人员没有很好地测试 ACTION_IMAGE_CAPTURE,并且有许多相机应用程序存在错误,例如完全忽略 EXTRA_OUTPUT

更多人会被前面提到的 file Uri 禁令绊倒,因为他们可能不期望 content Uri 这里。见鬼,Google 甚至懒得在他们自己的相机应用程序上测试 ACTION_IMAGE_CAPTURE ,以至于他们不处理 content Uri 值,和 will not do so for some time .

请随意使用 ACTION_IMAGE_CAPTURE,但要准备好优雅地失败。

关于android - 执行 ACTION_IMAGE_CAPTURE Intent 的可靠方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38081204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com