您的位置:首页 > 移动开发 > Android开发

Android 手电筒(最强适配版)

2014-11-05 18:51 295 查看
网上很多手电筒的代码,我这个是整理的比较合理的一个,适配也做的比较全(还好吧,还凑活吧,还行吧,凑活能用吧,不怎么报错吧,适配的还行额)。

使用:不停的调用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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: