Android 手电筒(最强适配版)
网上很多手电筒的代码,我这个是整理的比较合理的一个,适配也做的比较全(还好吧,还凑活吧,还行吧,凑活能用吧,不怎么报错吧,适配的还行额)。
使用:不停的调用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. emulator previousFlashMode = 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; } }