网上很多手电筒的代码,然后整理了下

使用:不停的调用onAndoff就能开和关手电筒

isopen是开关状态,比如你可以用他来判断手电是否打开。

可以看到使用了单例模式和线程同步,原因是你只有一个灯泡。

那边看代码,边看注释吧


public class Flash {private static Flash mFlash;private static Camera mCamera = null;private static Camera.Parameters mCameraParameters;private static String previousFlashMode = null;private static boolean isOpen = false;private Flash() {}public static Flash getInstance() {if (mFlash == null) {mFlash = new Flash();}return mFlash;}public synchronized void open(Context context) {if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {//这里的判断证实是没有用的,不能用来判断手机是否有灯泡,已经加了我就再没删try {mCamera = Camera.open();mCamera.setPreviewTexture(new SurfaceTexture(0));//这一句话很重要,不加的话在nexus 5上灯泡不亮} catch (Exception e) {close();String mString = context.getApplicationContext().getResources().getString(R.string.device_unable);Toast.makeText(context.getApplicationContext(), mString,Toast.LENGTH_LONG).show();//这里是打不开的情况,比如别人正在使用的灯泡,打不开用一个close关一次,下次就能打开了。}} else {Toast.makeText(context,context.getString(R.string.device_cannot_find),Toast.LENGTH_LONG).show();return;}if (mCamera != null) {mCameraParameters = mCamera.getParameters();previousFlashMode = mCameraParameters.getFlashMode();}if (previousFlashMode == null) {// could be null if no flash, i.e. emulatorpreviousFlashMode = Camera.Parameters.FLASH_MODE_OFF;}}public synchronized void close() {//关灯,就是用完之后清除一下camera对象,不然会影响其他设备的正常使用if (mCamera != null) {mCameraParameters.setFlashMode(previousFlashMode);mCamera.setParameters(mCameraParameters);mCamera.release();mCamera = null;isOpen = false;}}public synchronized void onAndOff(Context context) {//开\关都在这里调try {if (isOpen) {off();} else if (!isOpen) {on(context);}// send broadcast for widget//调完之后可以通知界面更新} catch (RuntimeException e) {Toast.makeText(context, R.string.device_unavailable,Toast.LENGTH_SHORT).show();}}public synchronized void on(Context context) {if (mCamera == null) {open(context);}if (mCamera != null) {mCameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);mCamera.setParameters(mCameraParameters);mCamera.startPreview();isOpen = true;}}public synchronized void off() {if (mCamera != null) {mCamera.stopPreview();mCameraParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);mCamera.setParameters(mCameraParameters);isOpen = false;}close();}public boolean isOpen() {return isOpen;}public void setOpen(boolean isOpen) {Flash.isOpen = isOpen;}}


更多相关文章

  1. Android判断EditText是否有输入内容的方法
  2. 一起学android之如何获取网络类型并判断是否可用(20)
  3. 如何判断 两个不同包名的 Android(安卓)应用的 Apk 签名是否一致
  4. Android开启手电筒功能(完美适配Android4x,5x,6x)
  5. Android(安卓)属性设置失败
  6. SAX解析 android sdk与jdk 有点区别
  7. 判断Edittext是否为几种空方法
  8. jQuery 判断iPad、iPhone、Android是横屏还是竖屏
  9. 如何判断Activity是否在前台显示

随机推荐

  1. 在php中检测浏览器,版本和平台的可靠方法
  2. 如何知道php zip扩展程序是否已安装?如何
  3. 从mysql中选择加密密码
  4. 《PHP高级知识进阶》系列技术文章整理收
  5. [CI]CodeIgniter视图 & 模型 & 控制器
  6. 不使用PHP框架的原因?
  7. 如何在没有小部件工厂的情况下在Yii2中设
  8. Zend Framework 2:活动菜单项。
  9. 如何使用Javascript ajax发送网址? [重复]
  10. 解决Apache2+PHP上传文件大小限制的问题