建议使用我新写的工具类,用了单例模式,使用更简单:https://blog.csdn.net/jingzz1/article/details/105787463

android6.0以下使用Camera,6.0以上则使用CameraManager

写这个工具类的时候,api版本只到28,目前9.0以下全部兼容,以后如果CameraManager开启闪光灯的方法没变,则继续向上兼容

初始化:FlashlightUtils flashlight = new FlashlightUtils();
开启闪光灯: flashlight.lightsOn(getContext());
关闭闪光灯:flashlight.lightsOff();
开启sos: flashlight.sos(getContext(),1);
关闭sos: flashlight.offSos();
判断设备是否有闪光灯:flashlight.hasFlashlight(getContext());
判断闪光灯是否打开:flashlight.isOff();
判断sos(求救信号是否开户):flashlight.isSos();
import android.annotation.TargetApi;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;import androidx.annotation.NonNull;import java.util.Timer;
import java.util.TimerTask;/** 手电筒(开启闪光灯)工具类* 使用前,先申请闪光灯权限 <uses-permission android:name="android.permission.FLASHLIGHT" />* 部分手机需要摄像头权限: <uses-permission android:name="android.permission.CAMERA" /> 注:注意android5.0以上权限调用* 使用前,请先用hasFlashlight()方法判断设备是否有闪光灯* 务必在activity或fragment的onDestroy()方法里调用lightsOff()方法,确保Camera被释放** 使用方法*  开启sos:new FlashlightUtils().sos()*  开启闪光灯: new FlashlightUtils().lightsOn()*/
public class FlashlightUtils {static {try {Class.forName("android.hardware.Camera");} catch (Exception ex) {throw new RuntimeException(ex);}}private Camera mCamera;private CameraManager manager;private boolean isSos = false;public boolean isOff() {if (isVersionM()) {return manager == null;} elsereturn mCamera == null;}//打开手电筒public void lightsOn(@NonNull Context context){lightsOn(context,false);}//关闭手电筒public void lightOff(){lightsOff(false);}private void lightsOn(@NonNull Context context,boolean isSos) {if(!isSos)offSos();if (hasFlashlight(context)) {if (isVersionM()) {linghtOn23(context);} else {lightOn22();}}else {Toast.makeText(context,"您的手机不支持开启闪光灯",Toast.LENGTH_SHORT).show();}}/*** 安卓6.0以上打开手电筒*/@TargetApi(Build.VERSION_CODES.M)private void linghtOn23(@NonNull Context context) {try {manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);manager.setTorchMode("0", true);// "0"是主闪光灯} catch (CameraAccessException e) {e.printStackTrace();}}/*** android6.0以下打开手电筒*/private void lightOn22() {if (mCamera == null) {mCamera = Camera.open();Camera.Parameters params = mCamera.getParameters();params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);mCamera.setParameters(params);}}private TimerTask mTimerTask;private Timer mTimer;private int mInt = 0;private Context context;//关闭sospublic void offSos() {isSos = false;if (mTimer == null)return;mTimer.cancel();mTimer = null;}public boolean isSos() {return isSos;}/*** 打开sos** @param context* @param speed   闪烁速度,建议取值1~6*/public void sos(@NonNull Context context, int speed) {offSos();if (speed <= 0) {throw new RuntimeException("speed不能小于等于0");}this.context = context;isSos = true;mTimerTask = new TimerTask() {@Overridepublic void run() {Message message = new Message();mInt = mInt == 0 ? 1 : 0;message.what = mInt;handler.sendMessage(message);}};mTimer = new Timer();mTimer.schedule(mTimerTask, 0, 1500 / speed);}Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:lightsOn(context,true);break;case 0:lightsOff(true);break;}}};private void lightsOff(boolean isSos) {if(!isSos)offSos();if (isVersionM()) {lightsOff23();} else {lightsOff22();}}//安卓6.0以下关闭手电筒private void lightsOff22() {if (mCamera != null) {Camera.Parameters params = mCamera.getParameters();params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);mCamera.setParameters(params);mCamera.release();mCamera = null;}}//安卓6.0以上打关闭电筒@TargetApi(Build.VERSION_CODES.M)private void lightsOff23() {try {if (manager == null) {return;}manager.setTorchMode("0", false);manager = null;} catch (Exception e) {}}private boolean isVersionM() {return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;}/*** 判断设备是否有闪光灯** @param context* @return true 有 false 没有*/public boolean hasFlashlight(Context context) {return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);}
}

android 闪光灯(手电筒)工具类,兼容android9.0相关推荐

  1. android 闪光灯(手电筒)工具类

    这是kotlin代码,复制代码的时候,请不要复制到java文件 ╮(╯▽╰)╭ java源码在下面!! android11逻辑没变,所以放到android11依旧兼容 需要闪光灯权限: <use ...

  2. Android 图片处理工具类封装2

    http://www.2cto.com/kf/201312/263638.html Android 图片处理工具类封装 2013-12-10     0个评论   来源:Wiker Yong 的专栏  ...

  3. SpUtil多样加密存储,兼容android9.0

    代码地址如下: http://www.demodashi.com/demo/15058.html ####前言 在android系统不断升级的过程中,Sharepreferences存储出现多中问题, ...

  4. Java解析Excel工具类(兼容xls和xlsx)

    依赖jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml< ...

  5. Android常用的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 最新最准确内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于J ...

  6. java 兼容excel_Java解析Excel工具类(兼容xls和xlsx)

    依赖jar org.apache.poi poi-ooxml 4.0.1 ExcelUtils.java package javax.utils; import java.io.File; impor ...

  7. 退出整个Android程序的工具类

    在实际的Android开发过程中常常有退出整个Android程序的需求,下面给大家介绍一下如何编写一个退出整个Android程序的工具类 package com.superGao.exitApp; i ...

  8. Android软键盘工具类

    Android软键盘工具类 public class SoftKeyboardUtils {/*** 隐藏或显示软键盘* 如果现在是显示调用后则隐藏 反之则显示*/public static void ...

  9. android 单位转换工具,Android单位转换工具类

    Android单位转换工具类 Android单位转换工具类主要由以下4部分构成 1.这个类不能被初始化 2.dip转px接口 3.sp转px接口 4.px转dip接口 代码如下: import and ...

最新文章

  1. c++ vector 存放指针_STL-C++ vector部分
  2. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS
  3. linux模拟内存数据落盘,Linux:保证数据安全落盘
  4. 女儿是程序员爸爸的小棉袄,礼物太暖心
  5. 95-134-105-源码-维表-维表优化
  6. Spring Boot细节挖掘(Docker部署项目)
  7. 【工具相关】Web-Sublime Text2的用法(一)
  8. java压测请求线程数_jmeter压力测试 设置一秒发送一次请求,一秒两次请求
  9. .NET Quartz 配置JOB
  10. 【美赛】2022美赛思路参考资料及其代码分享【全网最全】【美国大学生数学建模竞赛】【MCM/ICM】
  11. 计算机的基本组成和工作原理
  12. 下等人薄情,中等人深情,上等人……
  13. 调整SumatraPDF暗黑模式
  14. Lipschitz常数、Lipschitz条件
  15. 尝试加载 Oracle 客户端库时引发 BadImageFormatException
  16. 使用checkstyle对android代码进行格式检查和格式化(google格式)
  17. 【大数据开发】ClickHouse——ClickHouse函数(全)
  18. Profiler Others占用时间过高的解决方法
  19. Docker images导出和导入
  20. 求求你!别再考秒杀系统了!看完这篇怼回去 ~

热门文章

  1. 如何使用腾讯云web应用防火墙结合API网管提供安全防护?
  2. USB console线,USB转RJ45路由器调试线的前世今生
  3. 浅谈parseFloat(parseInt)与Number
  4. 面向对象——类的定义
  5. mvc 跳转到另一个controler
  6. Copy与Retain的区别
  7. Android自定义ProgressBar样式
  8. 华为计算机产业线线部门,华为服务器产品线升级为智能计算业务部
  9. Outlook2016如何配置Exchange邮箱
  10. 「哈德理安回忆录」导读介绍