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对象,然后对手电筒进行操作。

Android怎样绕开Camera打开手电筒的LED相关推荐

  1. Android 5.1 解决打开手电筒后,无法打开相机问题

    直接贴代码,按照faq修改后,无法实现预期效果,稍微修改后即可实现 diff --git a/alps/frameworks/av/services/camera/libcameraservice/C ...

  2. 如何在Android中打开/关闭相机LED /手电筒

    在本教程中,我们向您展示如何在Android中打开/关闭手机摄像头或手电筒. 查看代码段: 1.开启 camera = Camera.open();Parameters p = camera.getP ...

  3. android 打开手电筒 适配camera2

    只是修改了一个bug,应用商店就提示使用了某某某家的sdk不让通过. 最后还是--唉,以后还能不能愉快地玩耍,头疼. 正文 在android 5.0+的版本以前的的camera API被废弃, 所以如 ...

  4. android 带手电筒的扫一扫(1 可以自动打开手电筒,2 可以自动对焦,增加识别率)

    android 扫一扫 功能: 1 可以类似于摩拜单车的扫一扫,自动打开手电筒图标让我们打开手电筒. 2 可以自动聚焦 解释说明: 功能1 加上了手电筒的效果 说明 在项目中 CaptureActiv ...

  5. Android Camera 打开预览流程分析(一)--打开camera的SDK流程

    Android系统应用场景中,Camera的使用场景变得越来越重要,在手机端不管是牌照美颜,还是拍小视频上传小视频平台.在其他领域,如车载,倒车视频,360全景影像也同样会用到Camera接口.那我们 ...

  6. [Android驱动] 高通 Q PNP Flash LED驱动 及上层调用的流程

    直白的记录一下,翻译的文件来自kernel: kernel/documentation/devicetree/bindings/leds/leds-qpnp-flash.txt ----------- ...

  7. Android Studio 学习实例记录-手电筒

    Android Studio 学习实例记录-手电筒 刚安装好Android Studio3.1.2,上网搜了一个实例进行实践学习,仅用这篇文章来记录学习过程 MainActivity.java的源码来 ...

  8. 安卓 授权打开手电筒

    打开手电筒 大家好,我自己的项目是 写一个 扫一扫 ,同时开启 手电筒的功能,扫一扫 我用到了 Zxing ,然后呢 我网上找了手电筒的方法,加上之后 发现 额 不行 ,一直报这个错 android. ...

  9. nexus 5和三星Galaxy S4等中打开手电筒无效的解决方案

    吐槽一下:好几天都被一个卡死的bug烦恼,一直以为是自己写的有问题,后来找到原因才发现是我们程序自己的bug.很无语啊,他们在网上随便找了一个卸载反馈的功能加到我们程序中来,没想到这个功能导致内存泄漏 ...

最新文章

  1. kepserver 三菱fx_#电工培训# #plc培训# PLC培训 学在智通 赢在职场【三菱plc吧】
  2. 《信息学奥赛一本通》高精除以高精,求它们的商和余数。
  3. 本地计算机端口流量,计算机和防火墙上的端口及其用途-101问题
  4. 终端乱码的终极解决方案
  5. centos 6.5 防火墙开放指定端口
  6. centos 安装git_在Centos8上安装Git的方法
  7. SQL Server字符串左匹配
  8. 设计模式(四)行为型模式
  9. yum安装Apache2.4
  10. tensorflow Dataset API diff between make_initializable_iterator and make_one_shot_iterator
  11. android中jni的调用过程,Android 调用jni的过程简述
  12. JUnit5总体介绍
  13. 纯js油猴插件版GUI页面助手
  14. Windows10的电脑如何查找AppData文件夹
  15. 1|homework
  16. 1.5黄金白银最新行情走势分析预测,黄金实时操作建议
  17. 洛谷日报索引(2020、2019、2018)
  18. 几招就可轻松搞定证件照处理,还不快来码住!
  19. Caffe中的数据填充类Filler
  20. Python调用大华SDK:实现视频监控系统

热门文章

  1. 气传导耳机是不是智商税?气传导耳机靠谱吗?
  2. 台式计算机硬件组装步骤,电脑硬件组装详细步骤有哪些
  3. (五) 数据结构 - 归并排序
  4. 仿QQ设置头像(拍照/选择照片)
  5. 网站识别Windows AD 域账号,并自动登录
  6. 常用三角函数的无穷级数乘积公式推导详细过程与图形展示
  7. 华为云防火墙-firewall 打开关闭
  8. 化工厂人员定位系统--化工厂定位--新导智能
  9. app开发对于企业及商家来说为什么越来越重要?
  10. 销售crm系统排行?2022年终十大销售管理系统软件推荐