使用Content URI进行ACTION_VIDEO_CAPTURE

5

我目前正在使用文件提供程序上的内容URI来检索由 ACTION_IMAGE_CAPTURE 意图返回的相机图像。这很好地运作。

由于某种奇怪的原因,当尝试从相机检索视频文件时,相同的调用不起作用。

        destinationFile = File.createTempFile("video", ".mp4", this.getFilesDir());
        Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", destinationFile);

        Intent cameraIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        cameraIntent.setClipData(ClipData.newRawUri(null, uri));
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(cameraIntent, ID);

当意图在 onActivityResult() 中返回时,目标文件是空的。
只需将 MediaStore.ACTION_VIDEO_CAPTURE 替换为 MediaStore.ACTION_IMAGE_CAPTURE 即可获得预期的行为:拍摄的图像将保存在目标文件中。
这发生在 Nexus 设备上运行的原始 Android 6.0.1 上以及默认的 Google 相机应用程序中。
内容 URI 真的不支持视频捕获吗?我宁愿不使用公共可访问目录中的文件 URI。
1个回答

4
您有两个不同的问题:Google相机应用程序的行为和整个Android生态系统的行为。
关于Google相机应用程序,我们将其报告为与Android N相关的错误,因为在那里,如果您的targetSdkVersionN或更高,则只能使用contentUri。这将在即将发布的版本中得到修复。
话虽如此,如果其他相机应用程序遇到contentUri值的问题,我一点也不会感到惊讶。这是我对Android N有效禁止file方案的担忧之一,因为我们将遇到既不可靠的file也不可靠的content的情况,并且我们没有好的方法来检测这些情况。

离题一下,你删除了我的问题(指纹服务)的上一个答案,请重新回答 - 你是对的!只需要在缓存失效后进行操作即可!!请重新回答,这样我就可以接受你的答案了。 - Evgeniy Mishustin
所以目前我们必须继续使用文件URI - 除非针对Android N。感谢澄清! - limmatplatz
1
@limmatplatz:“必须”是一个强烈的词。当然,为了您的测试(和理智),在您的Google相机应用程序支持“content”之前,您需要坚持使用“file”并进行测试。但是,您可能希望利用这个机会确定当其他相机应用程序无法正确处理“content”时,您将要做什么。在您的“targetSdkVersion”达到“N”之前,“file”应该是安全的,并且应该得到广泛支持。希望您能够推迟提高“targetSdkVersion”的时间。比如,十年左右。 :-) - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接