内容简介:在项目中需要做个类似手电筒的功能。但是测试时出现了多款手机打不开闪光灯的情况,很奇怪。后来就发现是在Android5.0以后和5.0之前是不一样的。这里有一个工具类,可以直接拿到项目中使用。转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/25364.html
在项目中需要做个类似手电筒的功能。但是测试时出现了多款手机打不开闪光灯的情况,很奇怪。后来就发现是在Android5.0以后和5.0之前是不一样的。这里有一个 工具 类,可以直接拿到项目中使用。
public class LightManager {
private static final String TAG = LightManager.class.getName();
/**
* 上下文对象
*/
private Context context;
/**
* 是否已经开启闪光灯
*/
private boolean isOpenFlash = false;
/**
* Camera相机硬件操作类
*/
private Camera camera = null;
/**
* Camera2相机硬件操作类
*/
private CameraManager manager = null;
private CameraDevice cameraDevice;
private CameraCaptureSession captureSession = null;
private CaptureRequest request = null;
private SurfaceTexture surfaceTexture;
private Surface surface;
private String cameraId = null;
private boolean isSupportFlashCamera2 = false;
private LightManager() {
}
public LightManager(Context context) {
this.context = context;
}
/**
* 初始化相机
*/
public void init() {
this.manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
if (isLOLLIPOP()) {
initCamera2();
} else {
if (camera == null) {
camera = Camera.open();
}
}
}
/**
* 开启闪光灯
*/
public void turnOn() {
if (!isSupportFlash()) {
showToast("设备不支持闪光灯!");
return;
}
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
showToast("应用未开启访问相机权限!");
return;
}
if (isOpenFlash) {
return;
}
if (isLOLLIPOP()) {
turnLightOnCamera2();
} else {
turnLightOnCamera(camera);
}
}
/**
* 关闭闪光灯
*/
public void turnOff() {
if (!isSupportFlash()) {
showToast("设备不支持闪光灯!");
return;
}
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
showToast("应用未开启访问相机权限!");
return;
}
if (!isOpenFlash) {
return;
}
if (isLOLLIPOP()) {
turnLightOffCamera2();
} else {
turnLightOffCamera(camera);
}
isOpenFlash = false;
}
/**
* 开启Camera2闪光灯
*/
private void turnLightOnCamera2() {
new Object() {
private void _turnLightOnCamera2() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
showToast("应用未开启访问相机权限!");
return;
}
try {
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
cameraDevice = camera;
createCaptureSession();
}
@Override
public void onError(CameraDevice camera, int error) {
}
@Override
public void onDisconnected(CameraDevice camera) {
}
}, null);
} catch (Exception e) {
showToast("开启失败:" + e.getMessage());
}
}
}
}._turnLightOnCamera2();
}
/**
* 关闭Camera2闪光灯
*/
private void turnLightOffCamera2() {
new Object() {
private void _turnLightOffCamera2() {
if (cameraDevice != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cameraDevice.close();
}
}
}._turnLightOffCamera2();
}
/**
* 判断设备是否支持闪光灯
*/
public boolean isSupportFlash() {
if (isLOLLIPOP()) {
return isSupportFlashCamera2;
} else {
PackageManager pm = context.getPackageManager();
FeatureInfo[] features = pm.getSystemAvailableFeatures();
for (FeatureInfo f : features) {
// 判断设备是否支持闪光灯
if (PackageManager.FEATURE_CAMERA_FLASH.equals(f.name)) {
return true;
}
}
}
return false;
}
/**
* 是否已经开启闪光灯
*/
public boolean isTurnOnFlash() {
return isOpenFlash;
}
/**
* 判断Android系统版本是否 >= LOLLIPOP(API21)
*/
private boolean isLOLLIPOP() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return true;
} else {
return false;
}
}
/**
* 通过设置Camera打开闪光灯
*/
public void turnLightOnCamera(Camera mCamera) {
mCamera.startPreview();
Camera.Parameters parameters = mCamera.getParameters();
List<String> flashModes = parameters.getSupportedFlashModes();
String flashMode = parameters.getFlashMode();
if (!Camera.Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
// 开启闪光灯
if (flashModes.contains(Camera.Parameters.FLASH_MODE_TORCH)) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
}
}
isOpenFlash = true;
}
/**
* 通过设置Camera关闭闪光灯
*/
public void turnLightOffCamera(Camera mCamera) {
mCamera.stopPreview();
Camera.Parameters parameters = mCamera.getParameters();
List<String> flashModes = parameters.getSupportedFlashModes();
String flashMode = parameters.getFlashMode();
if (!Camera.Parameters.FLASH_MODE_OFF.equals(flashMode)) {
// 关闭闪光灯
if (flashModes.contains(Camera.Parameters.FLASH_MODE_OFF)) {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
}
}
isOpenFlash = false;
camera.release();
camera = null;
}
/**
* 初始化Camera2
*/
private void initCamera2() {
new Object() {
private void _initCamera2() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
try {
for (String _cameraId : manager.getCameraIdList()) {
CameraCharacteristics characteristics = manager.getCameraCharacteristics(_cameraId);
// 过滤掉前置摄像头
Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
continue;
}
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if (map == null) {
continue;
}
cameraId = _cameraId;
// 判断设备是否支持闪光灯
isSupportFlashCamera2 = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
}
} catch (Exception e) {
showToast("初始化失败:" + e.getMessage());
}
}
}
}._initCamera2();
}
/**
* createCaptureSession
*/
private void createCaptureSession() {
new Object() {
private void createCaptureSession() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
final CameraCaptureSession.StateCallback stateCallback = new CameraCaptureSession.StateCallback() {
public void onConfigured(CameraCaptureSession arg0) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
captureSession = arg0;
CaptureRequest.Builder builder;
try {
builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
builder.addTarget(surface);
request = builder.build();
captureSession.capture(request, null, null);
isOpenFlash = true;
} catch (Exception e) {
showToast("开启失败:" + e.getMessage());
}
}
}
public void onConfigureFailed(CameraCaptureSession arg0) {
}
};
surfaceTexture = new SurfaceTexture(0, false);
surfaceTexture.setDefaultBufferSize(1280, 720);
surface = new Surface(surfaceTexture);
ArrayList localArrayList = new ArrayList(1);
localArrayList.add(surface);
try {
cameraDevice.createCaptureSession(localArrayList, stateCallback, null);
} catch (Exception e) {
showToast("开启失败:" + e.getMessage());
}
}
}
}._createCaptureSession();
}
private void showToast(String content) {
Toast.makeText(context, content, Toast.LENGTH_LONG).show();
}
}
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/25364.html
微信打赏
支付宝打赏
感谢您对作者Miya的打赏,我们会更加努力! 如果您想成为作者,请点我
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 30个Python物联网小实验3:使用按钮开灯关灯
- Android获取软键盘的高度、键盘的打开与关闭、监听键盘处于打开还是关闭状态
- 关于python关闭
- Swift关闭UITextView键盘
- Android 书本打开和关闭动画
- CentOS 7 关闭透明大页
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
嵌入式系统软件设计中的常用算法
周航慈 / 2010-1 / 24.00元
《嵌入式系统软件设计中的常用算法》根据嵌入式系统软件设计需要的常用算法知识编写而成。基本内容有:线性方程组求解、代数插值和曲线拟合、数值积分、能谱处理、数字滤波、数理统计、自动控制、数据排序、数据压缩和检错纠错等常用算法。从嵌入式系统的实际应用出发,用通俗易懂的语言代替枯燥难懂的数学推导,使读者能在比较轻松的条件下学到最基本的常用算法,并为继续学习其他算法打下基础。 《嵌入式系统软件设计中的......一起来看看 《嵌入式系统软件设计中的常用算法》 这本书的介绍吧!