前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 9.0 对后台程序使用Mic、Camera做了限制?

Android 9.0 对后台程序使用Mic、Camera做了限制?

作者头像
小驰行动派
发布于 2024-12-05 05:47:47
发布于 2024-12-05 05:47:47
19300
代码可运行
举报
文章被收录于专栏:Android Camera开发Android Camera开发
运行总次数:0
代码可运行

01、发现问题

在android9.0 上修改原生的SnapdragonCamera 应用,需要修改成能支持后台录像,也就是Activity处于OnPause状态的时候,还是在录像(现在市面上支持后台录像的应用,基本都是在后台service中去开启录像,这个就不在本文的讨论场景了)。

原先的代码预览采用的surfaceView,后面修改成了使用textureView。不过发现按home键退出返回到桌面的时候,后台只能录制1分钟的视频,然后上报了camera error 3的错误。

这个error 3的错误,就是camera关闭了,camera 处于不可用状态下上报的异常。

02、问题分析

1 )根据上报的error来入手,这个error是从hardware层上报,经过CameraService.cpp,然后notify给上层,我们先来看下Camera error状态有哪些:

目前我们遇到的这个error 3,就是camera disable了,那就是那里把camera给关了。

2)第一步,我先在应用代码添加了日志,确认了上层没有自动关闭camera的操作。

接下来第二步是在CameraService.cpp中notifyError 的地方添加多点日志打印,确认是哪里回调的error信息。

根据打印的信息,跟踪下相关代码,发现CameraService这边在接收到uid 相关状态发生了变化的时候,是自动做了notify error 3,然后执行了disconnect Camera的操作。

代码语言:javascript
代码运行次数:0
运行
复制
void CameraService::UidPolicy::updateOverrideUid(uid_t uid, String16 callingPackage,
        bool active, bool insert) {
    ...
//判断到uid处于非active状态,然后执行了上报error3,并disconnect camera
    if (wasActive != isActive && !isActive) {
        sp<CameraService> service = mService.promote();
        if (service != nullptr) {
            service->blockClientsForUid(uid);
        }
    }
}

void CameraService::blockClientsForUid(uid_t uid) {
    const auto clients = mActiveClientManager.getAll();
    for (auto& current : clients) {
        if (current != nullptr) {
            const auto basicClient = current->getValue();
            if (basicClient.get() != nullptr && basicClient->getClientUid() == uid) {
                basicClient->block();
            }
        }
    }
}

void CameraService::BasicClient::block() {
    ...
    notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED, resultExtras);
    disconnect();
}


void CameraService::Client::notifyError(int32_t errorCode,
        const CaptureResultExtras& resultExtras) {
    (void) resultExtras;
    if (mRemoteCallback != NULL) {
        int32_t api1ErrorCode = CAMERA_ERROR_RELEASED;
        if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DISABLED) {
            api1ErrorCode = CAMERA_ERROR_DISABLED;
        }
        mRemoteCallback->notifyCallback(CAMERA_MSG_ERROR, api1ErrorCode, 0);
    } else {
        ALOGE("mRemoteCallback is NULL!!");
    }
}

3)根据上面的信息,网上查了下相关资料(https://blog.csdn.net/leonxu_sjtu/article/details/82787997),android 9.0上的确对后台程序使用mic、camera做了限制,如果uid处于idle状态,则会断开相应的硬件设备连接。

03、修改方案

因为我们可以修改framework层代码,所以在CameraService.cpp中把自动断开camera连接的地方给屏蔽掉.

自定义property属性ro.backgroundrecord.enable ,然后根据property属性值来判断是否需要屏蔽Android9.0的这个限制。

代码语言:javascript
代码运行次数:0
运行
复制
+++ b/frameworks/av/services/camera/libcameraservice/CameraService.cpp

@@ -2425,7 +2425,15 @@ void CameraService::UidPolicy::onUidIdle(uid_t uid, bool /* disabled */) {
     if (deleted) {
         sp<CameraService> service = mService.promote();
         if (service != nullptr) {
-            service->blockClientsForUid(uid);
+            char value[PROPERTY_VALUE_MAX];
+            property_get("ro.backgroundrecord.enable", value, "0");
+            int32_t enable = atoi(value);

+            if(enable){
+              ALOGV("---- enable background record,not need to block uid!!!");
+            }else{
+              service->blockClientsForUid(uid);
+            }
         }
     }
 }

《Android Camera开发入门》、《Camx初认识》已经上架,可以点击了解 -> 小驰成长圈 |期待见证彼此的成长

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小驰行动派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
早就不支持了。直接用cosbrowser多香
早就不支持了。直接用cosbrowser多香
回复回复点赞举报
官方已经不支持了。FTP 协议历史悠久了,与对象存储协议不兼容。如果有需要的话得自己买云主机部署 FTP 服务端软件:https://cloud.tencent.com/document/product/436/7214
官方已经不支持了。FTP 协议历史悠久了,与对象存储协议不兼容。如果有需要的话得自己买云主机部署 FTP 服务端软件:https://cloud.tencent.com/document/product/436/7214
回复回复点赞举报
推荐阅读
【Android】 Camera Framework层分析
Camera应用调用Framework Camera类API 在Android Kitkat原生Camera2应用(packages/apps/Camera2/)的PhotoModule, VideoModule, WideAnglePanoramaModule类中用CameraUtil.open()方法来打开Camera。然后依次调 用:CameraHolder的open()方法,AndroidCameraManagerImpl的cameraOpen()方 法,CameraHandler的handleMessage()【message为OPEN_CAMERA】,直到调用Framework Camera类(frameworks/base/core/java/android/hardware/Camera.java)的open()方 法。在这里,Camera2应用程序暂不做分析,我们着重看程序向下调用的服务请求过程。
程序员小何SS
2021/12/14
8290
小驰私房菜 | Dump Camera framework层jpeg
对于dumpsys media.camera 这个命令,我们估计会比较熟悉也用的比较多。今天来看下同样是和media.camera相关的,adb shell cmd media.camera。
小驰行动派
2024/11/23
900
小驰私房菜 | Dump Camera framework层jpeg
Android Vehicle HAL架构
初始化从执行hardware/interfaces/automotive/vehicle/2.0/default/VehicleService.cpp的main函数开始:
wizzie
2022/09/28
7.3K0
Android Vehicle HAL架构
Android Camera2 Focus Distance
有一段时间,我一直在查找Camera Focus distance相关内容。网上也查找了不少资料,有时看别人提的问题以及回答,也能给自己带来不少的帮助,希望下面的内容也能帮助到有需要的小伙伴~
小驰行动派
2022/12/20
1.7K0
OpenHarmony Camera源码分析
当前,开源在科技进步和产业发展中发挥着越来越重要的作用,OpenAtom OpenHarmony(简称“OpenHarmony”)赋予了开发者孕育创新的种子,也为数字化产业发展开辟了一片土壤。深开鸿是开源的坚定践行者,基于OpenHarmony聚焦智能物联网操作系统(KaihongOS)技术研发与持续创新。
小帅聊鸿蒙
2025/04/17
1030
OpenHarmony Camera源码分析
Android Linux Zygote启动
Android启动的第一个进程是由Linux Kernel启动的init进程。在init进程启动的过程中,会通过解析init.rc文件来启动zygote进程。
Rouse
2020/12/14
1.5K0
Android Linux Zygote启动
Android Framework分析(1)-init
init进程是Linux系统中用户空间的第一个进程,进程号固定为1。Kernel启动后,在用户空间启动init进程,并调用init中的main()方法执行init进程的职责。对于init进程的功能分为4部分:
老马的编程之旅
2022/06/23
1.1K0
Android Framework分析(1)-init
Camera系统 | HFR Usecase分析
高帧率录像即慢动作拍摄,通常人眼能够接受的最好的视频帧速率是24帧/每秒。如果用120帧/秒拍摄一个动作,再用24帧每秒来播放的话,视频就放慢了5倍。
Abalone
2023/03/14
2.7K0
Camera系统 | HFR Usecase分析
Android Camera开发系列:调整Camera预览方向
有时候我们想根据自己的需要调整下Camera的预览方向,那么是调用哪个API可以达到我们的目的呢?
小驰行动派
2021/04/19
2.4K0
Android HAL 与 HIDL 开发笔记
之前分析过 Android 系统中的进程间通信逆向,即基于 Binder 拓展的以及 AIDL 描述的 IPC。了解 Android 系统的话应该知道在 8.0 之后,/dev/binder 拓展多出了两个域,分别是 /dev/hwbinder 和 /dev/vndbinder 。其中 hwbinder 主要用于 HIDL 接口的通信,而 vndbinder 则是专注于 vendor 进程之间的 AIDL 通信。
evilpan
2023/02/12
1.8K0
OpenHarmony开发之——Camera模块
OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。
小帅聊鸿蒙
2024/08/29
3060
OpenHarmony开发之——Camera模块
这可能是全网关于Camera慢动作录像(SlowMotion)介绍最全的文章了
这是一篇关于慢动作录像(slowmotion)的文章,看完后相信你对慢动作录像不会再感到陌生了~
小驰行动派
2021/04/01
1.4K0
Android Camera2 API 同时使用前后摄像头预览
不久前,我承担了从运行Android的设备的前后摄像头获取同步提要的任务。 像往常一样,我去了Stack Overflow,然后去了GitHub,然后去了其他博客,才意识到我可能独自一人。 难过的感觉吧?
字节流动
2022/09/26
3.3K0
Android Camera2 API 同时使用前后摄像头预览
Android内存篇(一)---使用JVMTI监控应用
一般产品或项目前期都是以快速实现,上线的方式来完成,在生产环境中再开始进行优化,而Android的APP优化,比较重点的还是内存优化,因为每个APP都分配的最大内存,像内存泄露,内存抖动等慢慢都会让APP出来OOM崩溃的情况,最近也是一直在学习和研究内存优化这块,也是在实践中记录笔记。
Vaccae
2022/05/25
2.6K0
Android内存篇(一)---使用JVMTI监控应用
这可能是全网关于Camera慢动作录像(SlowMotion)介绍最全的文章了
这是一篇关于慢动作录像(slowmotion)的文章,看完后相信你对慢动作录像不会再感到陌生了~
小驰行动派
2021/04/30
2K0
Camera开发需要关注哪些点
我们接下来要分享VideoEditor中的相机处理模块,但是在分享之前,还是有必要将Camera的一些问题给理清楚,磨刀不误砍柴工,只有比较清晰地掌握Camera的一些特点和应用的规律,后续在优化性能和解决问题的时候就不会手忙脚乱了。
马上就说
2022/05/25
8080
Camera开发需要关注哪些点
Android9.0Wifi热点开启流程梳理
Android9.0中对热点做了较大改动,将热点很大程度从Wifi中剥离出来了。 下面我们看一下热点是怎么开启的。
用户7557625
2020/07/15
4.5K0
Android Camera1详解
最近因为工作需求,又要重新接触Android Camera1的API,详细整理了下相关知识点,这次没有记录到的知识点,后面会陆续补充,欢迎在公众号留言交流或者加我微信好友交流
雪月清
2020/07/09
3K0
Android Camera1详解
Android摄像头采集选Camera1还是Camera2?
好多开发者纠结,Android平台采集摄像头,到底是用Camera1还是Camera2?实际上,Camera1和Camera2分别对应相机API1和相机API2。Android 5.0开始,已经弃用了Camera API1,新平台重点开发Camera API2,Camera API1 会逐渐被淘汰。Camera API2 框架为应用提供更接近底层的相机控件,包括高效的零复制连拍/视频流以及曝光、增益、白平衡增益、颜色转换、去噪、锐化等方面的每帧控件。
音视频牛哥
2024/08/08
2980
Android摄像头采集选Camera1还是Camera2?
Android Camera2
从 Android 5.0 开始,Google 引入了一套全新的相机框架 Camera2(android.hardware.camera2)并且废弃了旧的相机框架 Camera1(android.hardware.Camera)。作为一个专门从事相机应用开发的开发者来说,这一刻我等了太久了,Camera1 那寥寥无几的 API 和极差的灵活性早已不能满足日益复杂的相机功能开发。Camera2 的出现给相机应用程序带来了巨大的变革,因为它的目的是为了给应用层提供更多的相机控制权限,从而构建出更高质量的相机应用程序。本文是 Camera2 教程的开篇作,本章将介绍以下几个内容:
ppchao
2020/12/01
2.2K0
Android Camera2
相关推荐
【Android】 Camera Framework层分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档