一、直接上测试代码吧
package com.giada.flickerled;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Bundle;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
protected boolean isopent = false;
private CameraManager manager;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
Button open = (Button) findViewById(R.id.open);
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!isopent)
{
try {
manager.setTorchMode("0", true);
} catch (CameraAccessException e) {
e.printStackTrace();
}
isopent=true;
}
else
{
try {
manager.setTorchMode("0", false);
} catch (CameraAccessException e) {
e.printStackTrace();
}
isopent=false;
}
}
});
}
}
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
二、在android 11 和android 8 真机上测试ok,点击按钮开关闪光灯。
三、另外一种形式,获取手电筒的开关状态,循环开关。获取手电筒状态的通过回调方法:mTorchCallback,一进入app就回有一个回调返回现在手电筒的状态。
package com.giada.flickerled;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Bundle;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import static android.hardware.Camera.Parameters.FLASH_MODE_ON;
public class MainActivity extends AppCompatActivity {
protected boolean isFlashLightOn = false;
private CameraManager mCameraManager;
public String TAG = "GIADATORCH";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取CameraManager
if(mCameraManager == null){
mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
}
mCameraManager.registerTorchCallback(mTorchCallback, null);
Button open = (Button) findViewById(R.id.open);
open.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toggleLight(!isFlashLightOn);
}
});
}
//callback成员变量初始化
private CameraManager.TorchCallback mTorchCallback = new CameraManager.TorchCallback() {
@Override
public void onTorchModeChanged(@NonNull String cameraId, boolean enabled) {
super.onTorchModeChanged(cameraId, enabled);
isFlashLightOn = enabled;
Log.d(TAG, "onTorchModeChanged cameraId=" + cameraId + ";enabled=" + enabled);
}
};
public void toggleLight(boolean OPEN) {
try {
//获取当前手机所有摄像头设备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_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) {
//打开或关闭手电筒
mCameraManager.setTorchMode(id, OPEN);
break;
}
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}
四、参考文章