直接贴代码了
public class MainActivity extends AppCompatActivity {
private Switch mSwitch;
private final int CAMERA_PERMISSION = 1;
private Camera mCamera;
private Camera.Parameters mParameters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSwitch = findViewById(R.id.switchBt);
mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) !=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION);
}
else {
openCamera();
}
}
else{
closeCamera();
}
}
});
}
/**
* 打开手电筒
*/
private void openCamera(){
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
if (openNewCamera(true))
Toast.makeText(MainActivity.this, "相机打开成功", Toast.LENGTH_SHORT).show();
else {
Toast.makeText(MainActivity.this, "相机打开失败", Toast.LENGTH_SHORT).show();
mSwitch.setChecked(false);//关闭开关
}
else
openOldCamera();
}
/**
* 关闭手电筒
*/
private void closeCamera(){
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
if ( openNewCamera(false))
Toast.makeText(this, "手电筒已关闭", Toast.LENGTH_SHORT).show();
else {
Toast.makeText(this, "手电筒已关闭", Toast.LENGTH_SHORT).show();
mSwitch.setChecked(true);
}
else
closeOldCamera();
}
/**
* 关闭旧版手电筒
*/
private void closeOldCamera() {
if (mCamera != null){
mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(mParameters);
mCamera.stopPreview();
}
}
/**
* 打开老版手机筒
*/
private void openOldCamera(){
if (mCamera ==null){
mCamera = Camera.open();
mParameters = mCamera.getParameters();
}
mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(mParameters);
mCamera.startPreview();
}
/**
* 打开手电筒
*/
@RequiresApi(api = Build.VERSION_CODES.M)
private boolean openNewCamera(boolean open) {
try {
//获取CameraManager
CameraManager mCameraManager = (CameraManager)MainActivity.this.getSystemService(Context.CAMERA_SERVICE);
//获取当前手机所有摄像头设备ID
String[] ids = mCameraManager.getCameraIdList();
for (String id : ids) {
CameraCharacteristics c = mCameraManager.getCameraCharacteristics(id);
//查询该摄像头组件是否包含闪光灯
Boolean flashAvailable = c.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
/*
* 获取相机面对的方向
* CameraCharacteristics.LENS_FACING_BACK 后置摄像头
*/
Integer lensFacing = c.get(CameraCharacteristics.LENS_FACING);
if (flashAvailable != null && flashAvailable
&& lensFacing != null && lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
//打开或关闭手电筒
mCameraManager.setTorchMode(id, open? true:false);
return true;
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
return false;
}
/**
* 权限申请
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == CAMERA_PERMISSION){
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
openCamera();//打开闪光灯
}
else {
Toast.makeText(this, "拒绝相机权限无法打开闪光灯", Toast.LENGTH_SHORT).show();
mSwitch.setChecked(false);//关闭开关按钮
}
}
}
/**
* 销毁时资源释放
*/
@Override
protected void onDestroy() {
super.onDestroy();
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
}
mCamera = null;
}
}