V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jeesk
V2EX  ›  Android

android 相机的疑惑

  •  
  •   jeesk · 2023-01-09 00:18:58 +08:00 · 10211 次点击
    这是一个创建于 710 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    14 条回复    2023-01-09 17:43:19 +08:00
    lengyuqu
        1
    lengyuqu  
       2023-01-09 00:26:06 +08:00
    我知道只有一种情况可以跳过相机权限调用摄像头,调用谷歌的扫码服务,会由谷歌服务调用摄像头,然后由谷歌回传扫码结果的情况下可以调用相机
    FranzKafka95
        2
    FranzKafka95  
       2023-01-09 00:33:32 +08:00 via Android
    系统预置的相机应用吧,不需要申请 CAMERA permission,触发 ACTION_IMAGE_CAPTURE intent 就可以进行 Capture
    qwwuyu
        3
    qwwuyu  
       2023-01-09 08:07:08 +08:00
    之前下载一个拍照 demo,发现它清单里没写相机权限,普通的 intent 就能调用.
    然后我在清单里加了权限,就要申请才能拍照.
    WanzizZ
        4
    WanzizZ  
       2023-01-09 09:29:17 +08:00
    kop1989smurf
        5
    kop1989smurf  
       2023-01-09 09:40:33 +08:00
    你自己也说了,他是调用的系统相机。并不是自己实现的 camera ,所以并不需要“相机”权限。
    https://developer.android.com/training/camera/photobasics?hl=zh-cn
    lakehylia
        6
    lakehylia  
       2023-01-09 10:17:17 +08:00
    这个不就是跟照片选择器一样的么?不需要存储权限
    unco020511
        7
    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
        8
    unco020511  
       2023-01-09 10:34:17 +08:00
    jeesk
        9
    jeesk  
    OP
       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
        10
    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
        11
    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
        12
    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
        13
    unco020511  
       2023-01-09 17:20:13 +08:00
    @sLvxq6Ya #12 你说的我是完全同意的,这或许就是一个折中方案

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

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

    这个机制确实有所取舍,或许在未来,会有更好的机制来处理这些场景
    jeesk
        14
    jeesk  
    OP
       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 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1071 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:56 · PVG 06:56 · LAX 14:56 · JFK 17:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.