编程语言
首页 > 编程语言> > 安卓10源码开发定制(29)手电筒控制源码分析

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

作者:互联网

一、前言

 

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

 

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

 

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

图片

   有图中可以知道所在包名为"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中执行以上代码之后,手电筒打开了。验证成功而且还不需要申请任何权限。

 

四、总结​​​​​​​

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

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

 


 

图片

图片

图片

标签:10,安卓,enabled,手电筒,cameraId,CameraManager,源码,public,FlashlightController
来源: https://blog.csdn.net/xiaomaNo01/article/details/114383819