查了很多資料,其他博客大多都是介紹以前的的方案,基于9.0系統(tǒng)的基本沒有找到,要么就不全,特別是獲取手電筒狀態(tài)的資料,下面就大致介紹一下:
打開和關(guān)閉的方法是:toggleLight
獲取手電筒狀態(tài)的通過回調(diào)方法:mTorchCallback(這就是為什么進(jìn)入頁面就需要注冊該回調(diào))
private CameraManager mCameraManager;
public void initData() {
//ivFlashlight是界面上的imageview控件
ivFlashlight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleLight(!isFlashLightOn);
}
});
//獲取CameraManager
if(mCameraManager == null){
mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
}
mCameraManager.registerTorchCallback(mTorchCallback, null);
}
//callback成員變量初始化
private CameraManager.TorchCallback mTorchCallback = new CameraManager.TorchCallback() {
@Override
public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {
super.onTorchModeChanged(cameraId, enabled);
Log.e(TAG, "onTorchModeChanged cameraId=" + cameraId + ";enabled=" + enabled);
isFlashLightOn = enabled;
ivFlashlight.setIcon(enabled ? MaterialDrawableBuilder.IconValue.FLASHLIGHT : MaterialDrawableBuilder.IconValue.FLASHLIGHT_OFF);
}
};
public void toggleLight(boolean OPEN) {
try {
//獲取當(dāng)前手機(jī)所有攝像頭設(shè)備ID
String[] ids = mCameraManager.getCameraIdList();
for (String id : ids) {
CameraCharacteristics c = mCameraManager.getCameraCharacteristics(id);
//查詢該攝像頭組件是否包含閃光燈
Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
/*
* 獲取相機(jī)面對的方向
* CameraCharacteristics.LENS_FACING_FRONT 前置攝像頭
* CameraCharacteristics.LENS_FACING_BACK 后只攝像頭
* CameraCharacteristics.LENS_FACING_EXTERNAL 外部的攝像頭
*/
Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
if (flashAvailable != null && flashAvailable
&& lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
//打開或關(guān)閉手電筒
mCameraManager.setTorchMode(id, OPEN);
break;
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mCameraManager != null && mTorchCallback != null){
mCameraManager.unregisterTorchCallback(mTorchCallback);
}
}