前言
公司是做系统应用开发,现有一个需求,需开发一个手电筒,手电筒上会显示开关状态,一开始百度的时候并没有找到如何监听外部app调用手电筒状态的接口。但是我发现状态栏上的那个手电筒开关状态是根据当前手电筒状态一样的,当我在自己的应用内开启了手电筒,状态栏上会显示手电筒状态为开启,于是查找到其实现处。
StatusBar 手电筒实现
具体看 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightControllerImpl.java 代码
public class FlashlightControllerImpl implements FlashlightController {
private static final String TAG = "FlashlightController";
private final CameraManager mCameraManager;
private Handler mHandler;
private String mCameraId;
private boolean mTorchAvailable;
public FlashlightControllerImpl(Context context) {
mContext = context;
//代码1
mCameraManager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);
tryInitCamera();
}
private void tryInitCamera() {
try {
mCameraId = getCameraId();
} catch (Throwable e) {
Log.e(TAG, "Couldn't initialize.", e);
return;
}
if (mCameraId != null) {
ensureHandler();
//代码2
mCameraManager.registerTorchCallback(mTorchCallback, mHandler);
}
}
//代码3
public void setFlashlight(boolean enabled) {
boolean pendingError = false;
synchronized (this) {
if (mCameraId == null) return;
if (mFlashlightEnabled != enabled) {
mFlashlightEnabled = enabled;
try {
mCameraManager.setTorchMode(mCameraId, enabled);
} catch (CameraAccessException e) {
Log.e(TAG, "Couldn't set torch mode", e);
mFlashlightEnabled = false;
pendingError = true;
}
}
}
...
}
//判断是否有手电筒
public boolean hasFlashlight() {
//代码4
return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
private synchronized void ensureHandler() {
if (mHandler == null) {
HandlerThread thread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mHandler = new Handler(thread.getLooper());
}
}
private final CameraManager.TorchCallback mTorchCallback =
new CameraManager.TorchCallback() {
@Override
public void onTorchModeUnavailable(String cameraId) {
if (TextUtils.equals(cameraId, mCameraId)) {
setCameraAvailable(false);
}
}
@Override
public void onTorchModeChanged(String cameraId, boolean enabled) {
//代码5
}
};
}
复制代码
- 代码1 获取CamreaManager 服务
- 代码2,代码5: 代码2中注册对手电筒的监听,代码5中监听到手电筒开关状态
- 代码3 判断设置设备是否支持手电筒功能
- 代码4 设置手电筒
以上代码搬到自己的应用内,就可以实现手电筒状态的监听了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END