package dev.utils.app; import android.content.pm.PackageManager; import android.graphics.SurfaceTexture; import android.hardware.Camera; import dev.utils.LogPrintUtils; /** * detail: 手电筒工具类 * @author Ttt * <pre> * 在非 Camera 预览页面使用的话, 需要先调用 register(), 不使用的时候 unregister(); * </pre> */ public final class FlashlightUtils { private FlashlightUtils() { } // 日志 TAG private final String TAG = FlashlightUtils.class.getSimpleName(); // FlashlightUtils 实例 private volatile static FlashlightUtils sInstance; /** * 获取 FlashlightUtils 实例 * @return {@link FlashlightUtils} */ public static FlashlightUtils getInstance() { if (sInstance == null) { synchronized (FlashlightUtils.class) { if (sInstance == null) { sInstance = new FlashlightUtils(); } } } return sInstance; } // Camera 对象 private Camera mCamera; /** * 注册摄像头 * @return {@code true} success, {@code false} fail */ public boolean register() { try { mCamera = Camera.open(0); } catch (Throwable ignore) { return false; } if (mCamera == null) return false; try { mCamera.setPreviewTexture(new SurfaceTexture(0)); mCamera.startPreview(); return true; } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "register"); return false; } } /** * 注销摄像头 * @return {@code true} success, {@code false} fail */ public boolean unregister() { if (mCamera == null) return false; try { mCamera.stopPreview(); mCamera.release(); return true; } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "unregister"); } return false; } // = /** * 是否支持手机闪光灯 * @return {@code true} yes, {@code false} no */ public static boolean isFlashlightEnable() { PackageManager packageManager = AppUtils.getPackageManager(); return (packageManager != null) ? packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH) : false; } // = /** * 打开闪光灯 * @return {@code true} success, {@code false} fail */ public boolean setFlashlightOn() { return setFlashlightOn(mCamera); } /** * 打开闪光灯 * @param camera {@link android.graphics.Camera} * @return {@code true} success, {@code false} fail */ public boolean setFlashlightOn(final Camera camera) { if (camera != null) { try { Camera.Parameters parameters = camera.getParameters(); if (parameters != null && !Camera.Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode())) { try { parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); camera.setParameters(parameters); return true; } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "setFlashlightOn"); } } } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "setFlashlightOn - getParameters"); } } return false; } // = /** * 关闭闪光灯 * @return {@code true} success, {@code false} fail */ public boolean setFlashlightOff() { return setFlashlightOff(mCamera); } /** * 关闭闪光灯 * @param camera {@link android.graphics.Camera} * @return {@code true} success, {@code false} fail */ public boolean setFlashlightOff(final Camera camera) { if (camera != null) { try { Camera.Parameters parameters = camera.getParameters(); if (parameters != null && Camera.Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode())) { try { parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); camera.setParameters(parameters); return true; } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "setFlashlightOff"); } } } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "setFlashlightOff - getParameters"); } } return false; } // = /** * 是否打开闪光灯 * @return {@code true} yes, {@code false} no */ public boolean isFlashlightOn() { return isFlashlightOn(mCamera); } /** * 是否打开闪光灯 * @param camera {@link android.graphics.Camera} * @return {@code true} yes, {@code false} no */ public boolean isFlashlightOn(final Camera camera) { if (camera != null) { try { Camera.Parameters parameters = camera.getParameters(); return parameters != null && Camera.Parameters.FLASH_MODE_TORCH.equals(parameters.getFlashMode()); } catch (Exception e) { LogPrintUtils.eTag(TAG, e, "isFlashlightOn"); } } return false; } }