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

本文介绍了如何在Android 8.0系统源码层面限制camera功能,防止第三方应用使用相机。通过修改`Camera.java`源码,避免空指针异常,采用反射与JNI结合的方法,在绑定Surface时进行权限控制。在编译过程中遇到问题,通过执行`make update-api`解决。
摘要由CSDN通过智能技术生成

最近接到了公司的需求,因为公司设备是通过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);

进行初始化的

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

    public static Camera openLegacy(int cameraId, int halVersion) {
        if (halVersion < CAMERA_HAL_API_VERSION_1_0) {
            throw new IllegalArgumentException("Invalid HAL version " + halVersion);
        }

        return new Camera(cameraId, halVersion);
    }

这里的代码

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

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

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

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

    public final void setPreviewDisplay(SurfaceHolder holder) throws IOException {
        if (holder != null) {
            setPreviewSurface(holder.getSurface());
        } else {
            setPreviewSurface((Surface)null);
        }
    }
    public native final void setPreviewTexture(SurfaceTexture surfaceTexture) throws IOException;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值