在android5.0的快捷开关上面有一个手电筒的开关,并且支持后台运行。
需要明确的一点就是,之所以他们两个不能一起使用是因为手电筒其实调用的也是相机里面的闪光灯。他们作为同一个硬件是不能一起使用的
首先看一下手电筒是怎么工作的:
/SystemUI_q5.1/src/com/android/systemui/statusbar/policy/FlashlightController.java
private void postUpdateFlashlight() {
ensureHandler();
mHandler.post(mUpdateFlashlightRunnable);
}
重点在于他如何实现Runnable接口的
private final Runnable mUpdateFlashlightRunnable = new Runnable() {
@Override
public void run() {
updateFlashlight(false /* forceDisable */);
}
};
private void updateFlashlight(boolean forceDisable) {
try {
boolean enabled;
synchronized (this) {
enabled = mFlashlightEnabled && !forceDisable;
}
if (enabled) {
if (mCameraDevice == null) {
startDevice();
return;
}
if (mSession == null) {
startSession();
return;
}
if (mFlashlightRequest == null) {
CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
builder.addTarget(mSurface);
CaptureRequest request = builder.build();
mSession.capture(request, null, mHandler);
mFlashlightRequest = request;
}
} else {
if (mCameraDevice != null) {
mCameraDevice.close();
teardown();
}
}
} catch (CameraAccessException|IllegalStateException|UnsupportedOperationException e) {
Log.e(TAG, "Error in updateFlashlight", e);
handleError();
}
}
打开手电筒说白了就是先打开相机,利用相机中的闪光灯作为一个光源。
所以你打开了手电筒在去打开相机那是肯定不行的。一件裤子两个人穿那是肯定要打架的。
对于如何实现那是很简单的。
1、当打开相机的时候向手电筒发一个广播。判断状态,如果是开的则将手电筒关闭;
/SystemUI_q5.1/src/com/android/systemui/qs/tiles/FlashlightTile.java
2、当打开手电筒,放相机发一个广播,判断状态,如果是开着的则退出相机。
/SnapdragonCamera/src/com/android/camera/CameraActivity.java
修改代码如下:
一、/SystemUI_q5.1/src/com/android/systemui/qs/tiles/FlashlightTile.java
定义变量如下:
//added
private static final String CAMERA_OPEN_ACTION = "camera_open";
private static final String FLASHLIGHT_OPEN_ACTION = "flashlight_open";
//added end
修改构造方法如下:
public FlashlightTile(Host host) {
super(host);
//added Camera and FlashlightTile Mutex
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(CAMERA_OPEN_ACTION);
mContext.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
if(mState.value == true){
handleClick();
}
}
}, intentFilter);
//added end
mFlashlightController = host.getFlashlightController();
mFlashlightController.addListener(this);
}
修改 protected void handleClick()方法如下:
protected void handleClick() {
if (ActivityManager.isUserAMonkey()) {
return;
}
boolean newState = !mState.value;
//added Camera and FlashlightTile Mutex
if (newState == true) {
Intent intent = new Intent(FLASHLIGHT_OPEN_ACTION);
mContext.sendBroadcast(intent);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// added end
mFlashlightController.setFlashlight(newState);
refreshState(newState ? UserBoolean.USER_TRUE : UserBoolean.USER_FALSE);
}
二、/SnapdragonCamera/src/com/android/camera/CameraActivity.java
修改onCreate()方法如下:
public void onCreate(Bundle state) {
super.onCreate(state);
//added Camera and FlashlightTile Mutex
sendBroadcast(new Intent("camera_open"));
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
IntentFilter flashLightFilter = new IntentFilter();
flashLightFilter.addAction("flashlight_open");
registerReceiver(mFlashLightOpenReceiver, flashLightFilter);
//end
接收到广播之后的处理方法
//added Camera and FlashlightTile Mutex
private BroadcastReceiver mFlashLightOpenReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
};
//end
最后在onDestory()方法中对广播进行注销
//added Camera and FlashlightTile Mutex
if(mFlashLightOpenReceiver != null){
unregisterReceiver(mFlashLightOpenReceiver);
}
//end