安卓10源码开发定制(29)手电筒控制源码分析

一、前言

 

     最近突发奇想,想做一个项目。将闲置手机变成可以利用的智能家居设备,比如在家里面通过手机App控制另一台手机的手电筒开和关(当做电灯泡)等等操作。先从最简单的功能开始研究,控制手电筒开始。

 

二、手机手电筒所在App定位

 

     将手机usb调试模式接入电脑。然后使用uiautomatorviewer工具获取手电筒所在的界面信息。如下所示:

安卓10源码开发定制(29)手电筒控制源码分析

   有图中可以知道所在包名为"com.android.systemui"。在安卓系统源码中SystemUI应用的源码路径位于:

  •  
frameworks\base\packages\SystemUI

 

 

三、手电筒开关流程分析

  

  1.手电筒功能类定位

       通过关键字查找,手机下拉快捷设置中的手电筒控制相应的类为FlashlightTile。源文件路径为:

  •  
\frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tiles\FlashlightTile.java

    该类中抽取关键部分代码如下:

public class FlashlightTile extends QSTileImpl<BooleanState> implements        FlashlightController.FlashlightListener {    private final Icon mIcon = ResourceIcon.get(com.android.internal.R.drawable.ic_qs_flashlight);    private final FlashlightController mFlashlightController;    @Inject    public FlashlightTile(QSHost host, FlashlightController flashlightController) {        super(host);        mFlashlightController = flashlightController;        mFlashlightController.observe(getLifecycle(), this);    }     //点击    @Override    protected void handleClick() {        if (ActivityManager.isUserAMonkey()) {            return;        }        boolean newState = !mState.value;        //更新显示状态        refreshState(newState);        //设置手电筒开或者关        mFlashlightController.setFlashlight(newState);    }}

 

    以上代码中使用了FlashlightController中的setFlashlight来控制手电筒。接下来分析FlashlightController

 

  2.FlashlightController分析

     FlashlightController源码路径位于:

  •  
frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\policy\FlashlightController.java

    该类是一个接口类,需要找到具体的实现类。在同目录中找到FlashlightControllerImpl实现了FlashlightController接口类。FlashlightControllerImpl类中构造函数初始化了CameraManager。说明这个类使用了相机来控制操作手电筒开关。构造函数如下:​​​​​​​

  public FlashlightControllerImpl(Context context) {        mContext = context;        mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
        tryInitCamera();    }

      该类中实现了setFlashlight方法,方法代码如下:​​​​​​​

 public void setFlashlight(boolean enabled) {        boolean pendingError = false;        synchronized (this) {            if (mCameraId == null) return;            if (mFlashlightEnabled != enabled) {                mFlashlightEnabled = enabled;                try {                    // 使用setTorchMode来控制手电筒                    mCameraManager.setTorchMode(mCameraId, enabled);                } catch (CameraAccessException e) {                    Log.e(TAG, "Couldn't set torch mode", e);                    mFlashlightEnabled = false;                    pendingError = true;                }            }        }        dispatchModeChanged(mFlashlightEnabled);        if (pendingError) {            dispatchError();        }    }

    所以安卓中的手电筒实现原理就是调用CameraManager中的setTorchMode来控制开或者关。

 

三、写Demo验证

 

   根据以上分析原理。写了一个App验证一下。Demo核心的代码如下:​​​​​​​

 CameraManager cameraManager=(CameraManager)getSystemService(Context.CAMERA_SERVICE);        try {            cameraManager.registerTorchCallback(new CameraManager.TorchCallback() {                @Override                public void onTorchModeUnavailable(@NonNull String cameraId) {                    super.onTorchModeUnavailable(cameraId);                    d("onTorchModeUnavailable for cameraId:"+cameraId);                }                @Override                public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {                    super.onTorchModeChanged(cameraId, enabled);                    d("onTorchModeChanged for cameraId:"+cameraId+"  enable:"+enabled);                }            },handler);            cameraManager.setTorchMode("0", true);        }catch (Exception eeee)        {            d("eee:"+eeee.toString());        }

     Demo中执行以上代码之后,手电筒打开了。验证成功而且还不需要申请任何权限。

 

四、总结​​​​​​​

  • 安卓手电筒实现原理

    CameraManager.setTorchMode("0",true/false);

     本文主要分析安卓手机手电筒实现原理,为后面实现一个家庭局域网手机控制手机的智能家居系统开发做准备,该系统暂定为HOMEDroid。

如果你对安卓相关的开发学习感兴趣:

       可加作者的QQ群(1017017661),本群专注安卓方面的技术,欢迎加群技术交流。

 


 

安卓10源码开发定制(29)手电筒控制源码分析

安卓10源码开发定制(29)手电筒控制源码分析

安卓10源码开发定制(29)手电筒控制源码分析

上一篇:.Net 使用SuperSockect实现 TCP服务端与客户端的实时通信(二)客户端程序


下一篇:【SpringCloud】配置:application.yml中都应该写些啥?