内容简介:在项目中需要做个类似手电筒的功能。但是测试时出现了多款手机打不开闪光灯的情况,很奇怪。后来就发现是在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 关闭透明大页
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
图解TCP/IP : 第5版
[日]竹下隆史、[日]村山公保、[日]荒井透、[日]苅田幸雄 / 乌尼日其其格 / 人民邮电出版社 / 2013-7-1 / 69.00元
这是一本图文并茂的网络管理技术书籍,旨在让广大读者理解TCP/IP的基本知识、掌握TCP/IP的基本技能。 书中讲解了网络基础知识、TCP/IP基础知识、数据链路、IP协议、IP协议相关技术、TCP与UDP、路由协议、应用协议、网络安全等内容,引导读者了解和掌握TCP/IP,营造一个安全的、使用放心的网络环境。 本书适合计算机网络的开发、管理人员阅读,也可作为大专院校相关专业的教学参考......一起来看看 《图解TCP/IP : 第5版》 这本书的介绍吧!