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

 

建议使用我新写的工具类,用了单例模式,使用更简单: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;
        } else
            return 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;

    //关闭sos
    public 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() {
            @Override
            public 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() {
        @Override
        public 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);
    }
}

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值