Android怎样绕开Camera打开手电筒的LED

news/2024/12/21 20:53:26/

       Android原生系统没有提供手电筒的API,很多手电筒的apk都是通过打开camera然后调用Flash来打开LED。

       这种传统的做法有很多弊端,首先通过camera打开手电筒,会增加因为camera出粗而导致手电筒异常的风险;其次,因为要先打开camera,然后打开Flash,因此会额外增加很多功耗。

       因此理想的解决方法是,在HAL层和JNI层封装出手电筒的接口,上层应用直接调用手电筒的API打开LED。


在Android的HAL层和JNI层添加手电筒的接口,包含以下一些步骤:

1. 在HAL层添加Light的接口

     a. 定义手电筒LED的文件节点路径:

         char const * const TORCH_FILE  = "/sys/class/leds/led:flash_torch/brightness";

     b. 定义控制手电筒LED的接口:

         static int set_light_torch(struct light_device_t* dev, struct light_state_t const* state)
         {
             int err = 0;
             pthread_mutex_lock(&g_lock);
             err = write_int(TORCH_FILE, state->color & 0xFF);
             pthread_mutex_unlock(&g_lock);
             return err;
          }

      c. 定义手电筒对应的Light ID:

          在Lights.h中添加 #define LIGHT_ID_TORCH          "torch"

      d. 在open_lights函数里面添加如下代码:

           else if (0 == strcmp(LIGHT_ID_TORCH, name))
                  set_light = set_light_torch;


2. 在JNI层添加相应的接口

     a. 在com_android_server_LightsService.cpp文件的init_native( )函数中添加手电筒的Light结构体:

         devices->lights[LIGHT_INDEX_TORCH]  = get_device(module, LIGHT_ID_TORCH);

     b. 在Light类型的enum变量中添加手电筒的类型索引

          LIGHT_INDEX_TORCH = 8,

     c. 在LightService.java文件中添加手电筒Light的Id

         public static final int LIGHT_ID_TORCH = 8;


3. 在Java服务层添加LightServices的接口

     a. 在PowerManagerService.java文件中添加相应的接口,具体如下:

         在PowerManagerService的类定义中增加手电筒Light的对象

                 private LightsService.Light mTorchLight;

         在systemReady( )接口中创建手电筒Light的实例

                 mTorchLight = mLightsService.getLight(LightsService.LIGHT_ID_TORCH);

         在PowerManagerService的类定义中添加调用手电筒Light的接口

                 @Override // Binder call
                 public void setTorchLight(int brightness) {
                       mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
                       final long ident = Binder.clearCallingIdentity();
                       try {
                           setTorchLightBrightness(brightness);
                       } finally {
                       Binder.restoreCallingIdentity(ident);
                       }
                 }

                 public void setTorchLightBrightness(int brightness) {
                     LightsService.Light light;
                     synchronized (mLock) {
                         if (!mSystemReady) {
                             return;
                         }
                         light = mTorchLight;
                     }
                     // Control light outside of lock.
                     light.setBrightness(brightness);
                 }

       b. 在PowerManager.java文件里面定义供应用层调用的手电筒API:

            public void setTorchBrightness(int brightness) {
                try {
                    mService.setTorchLight(brightness);
                } catch (RemoteException e) {
                }
            }

       c. 在IPowerManager.aidl文件中添加手电筒的接口:

           void setTorchLight(int brightness);

       d. 在BridgePowerManager.java文件中添加接口:

           @Override
           public void setTorchLight(int arg0) throws RemoteException {
           // pass for now. 
           }


       至此,从HAL到JNI的所有接口都已经添加完毕,应用层可以通过LightService来获取手电筒的Light对象,然后对手电筒进行操作。


http://www.ppmy.cn/news/736039.html

相关文章

iphone手游模拟器_如何将iPhone用作手电筒

iphone手游模拟器 If you find yourself in a situation where you need some extra light, the flash on your iPhone’s camera works great as a flashlight. There are more features to this than you might expect, so here’s how to use it. 如果您发现自己需要更多的光…

Android平板怎么截屏,ipad mini怎么截图 iPad/iPad mini截图技巧图解

截图不仅在电脑中很常用,比如在看到某些漂亮的画面、编写一些教程的时候都需要用到截图。最近在微博上看到一些分享iPad截图技巧小知识很受大家欢迎,由于微博篇幅小,描述的不是很清楚,不少网友依然没有学会使用iPad截图。今天脚本…

IOS 手电筒实例

作者:朱克锋 邮箱:zhukefengiboxpay.com 转载请注明出处:http://blog.csdn.net/linux_zkf -(void) turnOnLed:(bool)update { AVCaptureDevice *device [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device h…

getsockname()和getpeername()

API 1. getpeername() #include <sys/socket.h>int getpeername(int sockfd, struct sockaddr *restrict addr,socklen_t *restrict addrlen);// On success, returns 0. On error, -1 is returned and errno is set.返回连接到sockfd对端的地址&#xff0c;存入addr。…

Springboot2.6+Swagger2无法扫描到接口:No operations defined in spec!

先检查一遍swagger扫描开启&#xff0c;enable&#xff1a;true&#xff1b;扫描路径配置正确后仍然还是不显示 springboot2.6swagger2.9.2无法扫描到接口问题解决 多模块环境下,swaggerConfig配在公共模块,发现部分模块无法扫描到Controller接口。如下图所示&#xff1a; 经检…

LVS负载均衡群集——DR直接路由模式

一.LVS数据包流向分析 1.数据包流向 &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Ser…

差分进化算法(Differential Evolution,DE,附简单案例及详细matlab源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、概论二、差分进化算法&a…

微信测试公众号申请配置

打开此网页进行申请测试公众号微信公众平台 点击登录进入到二维码扫描界面&#xff0c;使用微信扫描进入如下界面&#xff1a; 界面自动获取appID、appsecret(需要记录一下&#xff0c;后面会用到)。 域名输入Tomcat访问地址 注意不要加上http或后缀 下拉配置网页账号&#x…