Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Android 手电筒(最强适配版)

网上很多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;
 }}最简单的Ubuntu Touch & Android 双系统安装方式 http://www.linuxidc.com/Linux/2014-01/94881.htm在Nexus上实现Ubuntu和Android 4.4.2 双启动 http://www.linuxidc.com/Linux/2014-05/101849.htmUbuntu 14.04 配置 Android SDK 开发环境 http://www.linuxidc.com/Linux/2014-05/101039.htm64位Ubuntu 11.10下Android开发环境的搭建(JDK+Eclipse+ADT+Android SDK详细) http://www.linuxidc.com/Linux/2013-06/85303.htmUbuntu 14.04 x64配置Android 4.4 kitkat编译环境的方法 http://www.linuxidc.com/Linux/2014-04/101148.htmUbuntu 12.10 x64 安装 Android SDK http://www.linuxidc.com/Linux/2013-03/82005.htm更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-12/110767.htm