在没有 WRITE_EXTERNAL_STORAGE 权限的情况下在 Android 8 上使用相机

Posted

技术标签:

【中文标题】在没有 WRITE_EXTERNAL_STORAGE 权限的情况下在 Android 8 上使用相机【英文标题】:Use Camera on Android 8 without WRITE_EXTERNAL_STORAGE permission 【发布时间】:2020-04-24 05:48:13 【问题描述】:

我正在尝试让我的应用程序捕获图像并将其发送到服务器,而不是存储在文件系统中。

如果我这样做:

intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, SOME_REQUEST_CODE);

onActivityResult我可以通过

Bitmap photo = (Bitmap) data.getExtras().get("data");

但这只会给我一个缩略图

从文档看来(其中一种?)获得全高清图像的方法是指示相机应用程序将图像存储在某个外部位置,方法是添加

intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

但这显然需要WRITE_EXTERNAL_STORAGE

考虑到我不需要将图像存储在文件系统中,因为无论如何我都是通过网络发送它,我相信要求额外的存储权限是违反“只问你需要什么”的原则。那么是否有可能以某种方式在内存中获取完整的高清图像并避免向用户询问存储权限?对于这种情况,也许存在一些特殊的 FileProvider 路径类型?

我找到了这个答案:Capture image without permission with android 6.0,但它不使用 FileProvider(我必须在 Android 8 上使用)并且似乎不适用于我的情况。

谢谢。

【问题讨论】:

【参考方案1】:

系统相机应用或第三方相机应用无法访问您应用的内部存储,您的应用也无法访问其他相机应用的内部存储。因此,外部存储似乎是您的应用和相机应用之间传输数据的唯一方式。

【讨论】:

好点。你很好地解释了原因。谢谢【参考方案2】:

只需使用文件提供程序并保存到 getFilesDir 或 getExternalFilesDir,您不需要 WRITE 权限或询问用户..

【讨论】:

谢谢!我不知道它不需要任何额外的权限,因为互联网上的大多数教程都提到请求存储权限。这有效。 有教程吗?我在 FileProvider 上找到了很多教程,WRITE_EXTERNAL_STORAGE 仍在使用 LOL。喜欢这个:agrawalsuneet.github.io/blogs/… 那是他们使用 getExternalStorageDirectory() 的时候。那么你需要它们。

以上是关于在没有 WRITE_EXTERNAL_STORAGE 权限的情况下在 Android 8 上使用相机的主要内容,如果未能解决你的问题,请参考以下文章

Vue Prop 没有初始化器,也没有在构造函数中明确赋值

在 Facebook 上分享有时效果很好,有时效果不佳(没有标题、没有描述、没有缩略图)

在没有隐藏溢出的情况下,transitionend 事件在 FireFox 中没有持续触发

有没有办法在没有活动的情况下使用 Viewpager 实现 TabLayout?

有没有办法在没有大括号的 tsx typescript 代码中进行评论?

在没有库的情况下制作矩阵/在列表中没有任何内容的情况下插入嵌套列表