当前位置:   article > 正文

Android 8.0 修改底层源码限制camera相机拍摄功能-包括处理系统源码修改后编译不过问题_android 修改相机源码

android 修改相机源码

最近接到了公司的需求,因为公司设备是通过android 8.0源码自己编译全量包,安装到自己机器中,所以需要把android 调用camera 标准api 全部限制住,禁止第三方app可以使用设备的摄像头,只能通过我们自己的sdk才允许使用。

最开始想通过 修改AndroidManifest.xml 中的

    <uses-permission android:name="android.permission.CAMERA" />

相机权限来限制,当时通过全文替换来修改相机权限名字,当镜像文件编译完成后,虽然像系统相机的确无法正常使用了,但是其他app在清单文件中设置新的权限名字,出现了两个问题:

1:这种所谓的自定义权限无法传递到源码中camera.java 他获取不到(这里有大神知道吗 可以参与讨论一下)

2:一但自定义权限名字泄漏出去,第三方app还是可以继续使用摄像头

那么这样肯定是不行的。所以我把目光放到了8.0源码中 android.hardware.Camera.java (在这里我们都知道 调用相机的方式 目前谷歌提供了几种方式 camera camera2 cameraX 这里我们只拿camera 举例子 如果大家有需要以后会继续更新)

好了接下来我们来看camera源码 有两个地方需要大家注意一下 当我们使用camera初始化的时候 是调用

Camera.open(cameraId);

进行初始化的

但是系统相机初始化是走的

  1. public static Camera openLegacy(int cameraId, int halVersion) {
  2. if (halVersion < CAMERA_HAL_API_VERSION_1_0) {
  3. throw new IllegalArgumentException("Invalid HAL version " + halVersion);
  4. }
  5. return new Camera(cameraId, halVersion);
  6. }

这里的代码

现在有两种选择 你可以直接在构造方法直接加入一个限制开关 , 也可以在绑定Surface的代码与获取yuv 回调的时候限制

第一种直接在构造方法限制,不过这样如果是未授权app 获取camera对象直接就返回的null 这样会造成其他app直接发生 空指针异常,非常不友好

第二种在 绑定Surface的代码与获取yuv 回调的时候限制 这种方式比较麻烦,但是不会引发空指针异常与意外闪退方式

这里我们使用第二种方式,这里我们先介绍在源码中限制的方法都有哪些

  1. public final void setPreviewDisplay(SurfaceHolder holder) throws IOException {
  2. if (holder != null) {
  3. setPreviewSurface(holder.getSurface());
  4. } else {
  5. setPreviewSurface((Surface)null);
  6. }
  7. }
    public native final void setPreviewTexture(SurfaceTexture surfaceTexture) throws IOException;
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/461403
推荐阅读
相关标签
  

闽ICP备14008679号