设为首页 加入收藏

TOP

Android 手电筒(最强适配版)
2015-02-02 14:31:56 来源: 作者: 【 】 浏览:11
Tags: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;
?}


}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android shap 控件美化 下一篇Build kernel时make oldconfig、m..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: