android 相机的疑惑

2023-01-09 00:18:58 +08:00
 jeesk

有些软件直接跳转到了系统的相机,但是这个应用并没有摄像头权限? 这个是 intent ? 最近发现了一些 app 拍照竟然没有申请权限, 有大佬解答一下,这个是什么类型的 intent 的吗? (应用并没有弹窗申请权限就跳转到了系统相机,着实有点奇怪)

9747 次点击
所在节点    Android
14 条回复
lengyuqu
2023-01-09 00:26:06 +08:00
我知道只有一种情况可以跳过相机权限调用摄像头,调用谷歌的扫码服务,会由谷歌服务调用摄像头,然后由谷歌回传扫码结果的情况下可以调用相机
FranzKafka95
2023-01-09 00:33:32 +08:00
系统预置的相机应用吧,不需要申请 CAMERA permission,触发 ACTION_IMAGE_CAPTURE intent 就可以进行 Capture
qwwuyu
2023-01-09 08:07:08 +08:00
之前下载一个拍照 demo,发现它清单里没写相机权限,普通的 intent 就能调用.
然后我在清单里加了权限,就要申请才能拍照.
WanzizZ
2023-01-09 09:29:17 +08:00
kop1989smurf
2023-01-09 09:40:33 +08:00
你自己也说了,他是调用的系统相机。并不是自己实现的 camera ,所以并不需要“相机”权限。
https://developer.android.com/training/camera/photobasics?hl=zh-cn
lakehylia
2023-01-09 10:17:17 +08:00
这个不就是跟照片选择器一样的么?不需要存储权限
unco020511
2023-01-09 10:29:46 +08:00
「尽量减少权限请求」 https://developer.android.com/training/permissions/evaluating?hl=zh-cn

用户可能会在您的应用中使用预安装的系统相机应用来拍摄照片。

在这种情况下,请勿声明 CAMERA 权限,而是改为调用 ACTION_IMAGE_CAPTURE intent 操作。
unco020511
2023-01-09 10:34:17 +08:00
jeesk
2023-01-09 10:57:33 +08:00
@unco020511 仔细看了文档 android m 以上, 使用 ACTION_IMAGE_CAPTURE 的 intent 都要 camera 权限。
https://developer.android.com/reference/android/provider/MediaStore?hl=zh-cn#ACTION_IMAGE_CAPTURE.
unco020511
2023-01-09 11:16:43 +08:00
@jeesk #9
"注意:如果您的应用面向 M 及更高版本并声明使用 Manifest.permission.CAMERA 未授予的权限,则尝试使用此操作将导致 SecurityException."

这段话的意思是「如果你在 Manifest 中声明了 CAMERA 权限」,同时你在运行时没有动态申请该权限的情况下,去调用 ACTION_IMAGE_CAPTURE intent 启动三方相机应用,则会抛出异常

so:
- 如果你的应用只使用 ACTION_IMAGE_CAPTURE 等,直接从清单中
删除 CAMERA 权限;

- 如果你的应用使用其他 CAMERA 功能(比如应用内扫码或者自定义相机):在运行时
检查 CAMERA 权限并仅在权限可用时启动 intent 来调用三方相机;

Android 为什么会设定这种有点奇怪的机制?: 不得而知
unco020511
2023-01-09 11:25:36 +08:00
@unco020511 #10 我找到了一些官方对此机制的一些解释
https://issuetracker.google.com/issues/37063818#comment8

''这是有意为之的行为,以避免用户在他们从应用程序撤消相机许可并且应用程序仍然能够通过意图拍照时感到沮丧。用户不知道权限撤销后拍摄的照片是通过不同的机制发生的,并且会质疑权限模型的正确性。这适用于 MediaStore.ACTION_IMAGE_CAPTURE 、MediaStore.ACTION_VIDEO_CAPTURE 和 Intent.ACTION_CALL 文档,其中记录了针对 M 的应用程序的行为更改。"

感觉能说的通,但又一些勉强
sLvxq6Ya
2023-01-09 17:00:42 +08:00
@jeesk @unco020511
这个限制的意义是这样的
如果一个应用声明需要 camera 权限,那么它通过 IMAGE_CAPTURE 调起相机的时候也需要权限
如果一个应用声明不需要 camera 权限,那么它就可以不需要权限通过 IMAGE_CAPTURE 直接调起系统相机

举个例子来说
假设有一个美颜相机 app ,其中既有美颜相机的功能(基于 camera 权限),又有调起系统相机拍照的功能(基于 IMAGE_CAPTURE)
用户当然希望这两个权限在设置中对应一个相机权限,可以一起关闭和打开

而如果这个 app 是一个笔记 app ,其中只有调起系统相机拍照插入图片的功能(基于 IMAGE_CAPTURE)
那么对用户和系统来说,这个调用是绝对安全的,没有泄漏隐私的风险
就可以不要求 app 声明和申请 CAMERA 权限

我个人理解这是在一个权限管理,开发者适配成本,用户体验之间的妥协方案
不过安卓的权限确实是一言难尽,只能建议别想太多
unco020511
2023-01-09 17:20:13 +08:00
@sLvxq6Ya #12 你说的我是完全同意的,这或许就是一个折中方案

但这里面又涉及一个问题,就是用户是否能区分「应用内相机」和「调起三方拍照」.
- 假如用户能区分,那上面的机制完全没必要存在
- 假如说用户无法区分,那对于用户来说,你任何情况通过 intent 来拍照都应该经过我的允许,但 android 的设计是不需要权限(假如你的应用只调起三方,无需声明权限),这是否矛盾?

想象一种场景,你的应用既有「应用内相机」也有「调起三方拍照」功能,但「应用内相机」功能还没触发,因此你的设置里就不会存在拍照权限,来到调起三方拍照时,用户需要授予权限,这是否会让用户很困惑?

这个机制确实有所取舍,或许在未来,会有更好的机制来处理这些场景
jeesk
2023-01-09 17:43:19 +08:00
我昨天折腾了一下,大约的结果是。
android 拍照有 2 种,
1. 直接跳转到系统相机,intent 是 android.media.action.STILL_IMAGE_CAMERA , 通过后台多任务可以看到的确是在系统相机应用里面, 并且该相机功能丰富, 不需要申请 camera 权限。

2. 调用 ACTION_IMAGE_CAPTURE , 该权限必须在 manifest 文件里面注册,并且动态申请权限, 该方式打开的相机功能十分简单,相机界面在当前 app 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907464

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX