背景:

项目在Android 7.0的系统新加了一个camera2用于扫描。问题出在如果调用camera.open(2)打开camera2后没有调用release,系统相机会卡死,扫描APK也会无法使用,客户希望从framework层规避此类问题。也就是,即使apk不正规调用camera(没有释放),也不应该引起系统camera挂掉

分析:

原因就是camera2被占用后开启camera0或者camera1时仍然使用的camera2的参数配置,导致分辨率什么的都不对,系统异常等待。

解决方案:

失败案例1:在hardware Camera类中加个静态变量来区分camera2是否busy,在camera open时判断如果是cameraid==2,就将标识位计为true,release时不做判断,直接置为false。在getCameraInfo判断,如果是true则抛出异常。但是现在标识位第一次使用后不知道在什么地方被置为false。后来经过调查,多进程会导致static变量无法共享,当扫描apk调用camera时,静态变量会先初始化为false,调用camera.open(2)时,标识位变成true,假设此次camera2没有成功释放,此时打开系统相机,由于系统相机是另一个应用,会开启另一个进程,那么标识位会重置为false,但实际上camera2并没有释放,应该是true。该方案被pass。
失败原因:多进程引起静态变量的重新初始化,java中static变量只会初始化一次是在同一进程,如果换了进程,也就不再是同一个static变量了。(Android艺术探索IPC通信一节有详细讲为什么会出问题)

其他方案:使用数据库(Settings.Global.putInt()或者写文件或者使用SystemProperties.set(“myflag”,”true”);的方式,理论上是可行的,不过都最终卡在了权限问题上了,如果不设置adb shell setenforce 0,会导致无法创建文件,写数据库。而ystemProperties.set(“myflag”,”true”)会提示需要申请一个权限。如果是在App层,很容易做到,在清单文件配置即可,如果是android 6.0以上系统,需要添加主动申请权限的代码;但是现在修改的代码在framework base下面,完全不知道如何申请权限,如有大虾知道,还请不吝赐教。

最终方案:在frameworks/av/services/camera/libcameraservice/CameraService.cpp 和CameraService.h中做保护,定义一个方法,遍历camera,如果有任一camera在使用,就返回true(有camera在使用了,无法获取打开新的camera),只允许打开一个camera。

String8 id;
for(int i=0; i< mNumberOfCameras; i++)
{id = String8::format("%d", i);if (checkIfDeviceIsUsable(id) != NO_ERROR) {return true;}
}
return false;

checkIfDeviceIsUsable应该是android原生的代码

status_t CameraService::checkIfDeviceIsUsable(const String8& cameraId) const {auto cameraState = getCameraState(cameraId);int callingPid = getCallingPid();if (cameraState == nullptr) {ALOGE("CameraService::connect X (PID %d) rejected (invalid camera ID %s)", callingPid,cameraId.string());return -ENODEV;}int32_t currentStatus = cameraState->getStatus();if (currentStatus == ICameraServiceListener::STATUS_NOT_PRESENT) {ALOGE("CameraService::connect X (PID %d) rejected (camera %s is not connected)",callingPid, cameraId.string());return -ENODEV;} else if (currentStatus == ICameraServiceListener::STATUS_ENUMERATING) {ALOGE("CameraService::connect X (PID %d) rejected, (camera %s is initializing)",callingPid, cameraId.string());return -EBUSY;} else if (currentStatus == ICameraServiceListener::STATUS_NOT_AVAILABLE) {//此处为后来加上ALOGE("CameraService::connect X (PID %d) rejected, (camera %s is not available)",callingPid, cameraId.string());return -EBUSY;}return NO_ERROR;
}

不管camera对象有几个,管理camera的service只有一个,这样就不用考虑什么进程线程的问题了,其实上面的几个方案思路一致,都是记录一个标识位来表示camera2的使用状态,后来无法使用,有的是遇到跨进程共享问题,有的是遇到权限问题。不过说道跨进程共享问题,数据库和文件肯定是能解决问题的,但是无奈卡在权限问题上了。

Android开发 camera被占用的问题相关推荐

  1. linux摄像头拍照程序,Android开发:Camera初探——控制摄像头拍照

    实习接触的项目中需要调用系统摄像头进行拍照,通过完成这个功能点暂时初步了解了Android中的Camera,当然目前只是停留在使用阶段,对于Camera的深度剖析有机会也要了解一下. 通过Camera ...

  2. Android开发实践:掌握Camera的预览方向和拍照方向

    Android的Camera相关应用开发中,有一个必须搞清楚的知识点,就是Camera的预览方向和拍照方向,本文就重点讨论一下这个问题. 图像的Sensor方向:手机Camera的图像数据都是来自于摄 ...

  3. Android开发技巧——Camera拍照功能

    本篇是我对开发项目的拍照功能过程中,对Camera拍照使用的总结.由于camera2是在api level 21(5.0.1)才引入的,而Camera到6.0仍可使用,所以暂未考虑camera2. 文 ...

  4. android开发步步为营之112:关于Camera镜像上下左右颠倒问题的解决办法

    我们在做自定义相机开发的过程中,一般会使用SurfaceView或者GlSurfaceView做预览,预览或拍照的时候经常会碰到镜像的左右颠倒或者上下颠倒?这个该怎么处理,这里给出解决方案. 一.拍照 ...

  5. Hikvision IP Camera Android开发

    Hikvision Android开发 相关的资料和网址 官网:https://www.hikvision.com 官网文档下载 : https://open.hikvision.com/downlo ...

  6. Android使用camera开发手机相机应用

    首先先介绍一下我使用的编写软件:Android studio. 注:图片看不清楚不同着急,最后会将所有的代码都给各位的 接下来我们创建一个新的项目,之后来到activity_main.xml下: 将& ...

  7. adb 安卓模拟器 进程端口_Android开发中遇到的问题(一)——Android模拟器端口被占用问题的解决办法...

    一.问题描述 今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured& ...

  8. Android开发学习之路--Camera之初体验

    顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就能够通过camera来拍照,然后存储照片.发送给好友.那么微信的app里面是不会直接通过camera api来实现的,由于 ...

  9. Android开发:调用camera API 创建MediaRecorder

    本文出自 "whithin's" 博客,请务必保留此出处http://whithin.blog.51cto.com/690417/1063573 1. add  below thr ...

最新文章

  1. Blender建筑可视化技能学习视频教程
  2. 使用UrlRewrite时修改form的action属性问题
  3. MAUI中Maui.Graphics.Controls绘制控件
  4. jni直接转byte_JNI jbyteArray转char*
  5. [Java] - 项目中的防止同用户异地登录问题
  6. canvas画笔功能 Signature Pad
  7. 无人机——磁力计/电子罗盘 学习及校准
  8. 创建Django项目
  9. 蚂蚁金服实习生4.16面试
  10. 2018-01-05-医药行业的IT革命探讨
  11. ios MultipeerConnectivity蓝牙通讯
  12. 弗洛伊德的人格结构说中潜意识,前意识,意识和自我,本我,超我的区别
  13. word 项目符号(或称之为无序编号),默认,可以采用星号加空格方式实现。
  14. 实验过程分析1——数据集为什么需要按一定比例划分
  15. Mac 锦囊 —— 误删除admin组之后
  16. 从管好事提升管理水平--创建事
  17. oracle qq邮箱不能用,QQ邮箱怎么不能用?QQ邮箱崩了官方公告
  18. Date日期格式转换
  19. 基于深度学习的遥感影像语义分割数据预处理
  20. WORD显示Word无法创建工作文件请检查临时环境变量

热门文章

  1. 2524. 吃蛋糕 (新) (Standard IO)
  2. 创意css汉堡菜单动画,纯CSS3实现的汉堡菜单、飞碟和小行星动画
  3. 笔记本重置找不到恢复环境_重置Win10电脑时提示找不到恢复环境的解决教程
  4. 卡片式设计_总结及实践记录
  5. 洛谷——honoka的键盘
  6. 愤怒的小鸟计算机教案,愤怒的小鸟教案.doc
  7. 重读经典 | 亚马逊“一键下单”的背后——个性化推荐系统的发展历程
  8. 阿里云账号个人实名认证和企业实名认证有什么区别?
  9. 反转字符串里的单词 + 图示
  10. 虚拟机Ubuntu连接网卡相机