百度google一下现有的关于手电筒(实际上是闪光灯控制)的设计和源代码都有很多。

例如

http://www.oschina.net/code/snippet_107931_17160

http://blog.csdn.net/pengcheng_liu/article/details/23860679

Camera.Parameters param = mCamera.getParameters();
param.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(param);
mCamera.startPreview();

通过设置Camera的FLASH_MODE参数,可以将闪光灯设置为常亮状态,再用startPreivew()方法打开照相机的预览,就可以成功打开闪光灯。

但实际上这些方法只能适配部分机型,而Google Nexus 5、 HTC 部分机型等手机使用这些代码都不能打开闪光灯。

察看Android开发者文档,在Camera的class overview中可以看到我们忽略掉的部分。

http://developer.android.com/intl/zh-cn/reference/android/hardware/Camera.html

To take pictures with this class, use the following steps:

1.Obtain an instance of Camera from open(int).
2.Get existing (default) settings with getParameters().
3.If necessary, modify the returned Camera.Parameters object and call setParameters(Camera.Parameters).
4.If desired, call setDisplayOrientation(int).
5.Important: Pass a fully initialized SurfaceHolder to setPreviewDisplay(SurfaceHolder). Without a surface, the camera will be unable to start the preview.
6.Important: Call startPreview() to start updating the preview surface. Preview must be started before you can take a picture.
7.When you want, call takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) to capture a photo. Wait for the callbacks to provide the actual image data.
8.After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
9.Call stopPreview() to stop updating the preview surface.
10.Important: Call release() to release the camera for use by other applications. Applications should release the camera immediately in onPause() (and re-open() it in onResume()).

看到第五点(important),如果没有在startPreview之前调用setPreviewDisplay。照相机就不会启动预览。

所以问题解决,适用于市面上大部分机型的相机开启,需要在startPreview之前setPreivewDisplay:

Camera.Parameters param = mCamera.getParameters();
param.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(param);
mCamera.setPreviewDisplay(mHolder); //重要!在startPreview要调用
mCamera.startPreview();

为setPreviewDisplay(SurfaceHolder holder) 传入的SurfaceHolder参数需要在setPreviewDisplay前初始化完成:

private WindowManager mWindowManager;
private SurfaceHolder mHolder;
private MySurfaceView mFlashTorchSurface;private void createSurfaceView() {if (mFlashTorchSurface != null) {return;}try {mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); // 获取WindowManager// 添加手电筒所需要的SurfaceViewmFlashTorchSurface = new MySurfaceView(mContext);// 由于会在SurfaceView中进行预览,所以将背景色设置为黑色,使用户看不到mFlashTorchSurface.setBackgroundColor(Color.BLACK);WindowManager.LayoutParams mCallViewParams = new WindowManager.LayoutParams(); // 设置LayoutParams(全局变量)相关参数mCallViewParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;mCallViewParams.format = PixelFormat.RGBA_8888; // 设置透明背景mCallViewParams.width = 1;mCallViewParams.height = 1;mCallViewParams.gravity = Gravity.RIGHT | Gravity.TOP;mCallViewParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 让当前View失去焦点mWindowManager.addView(mFlashTorchSurface, mCallViewParams);} catch (Exception ex) {ex.printStackTrace();mFlashTorchSurface = null;}}/*** 手电筒需要的surface*/private class MySurfaceView extends SurfaceView implementsSurfaceHolder.Callback {public MySurfaceView(Context context) {super(context);initHolder();}private void initHolder() {// 注册surfaceCreated、surfaceChanged、surfaceDestroyed回调方法SurfaceHolder holder = getHolder();holder.addCallback(this);holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 在某些机型上,这一项必须设置}@Overridepublic void surfaceCreated(SurfaceHolder holder) {mHolder = holder;}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {mHolder = null;}}

这样,大部分机型都可以打开手电筒了。

完整的打开关闭方法如下:

public void powerOn() {
//打开手电initCamera(); //初始化相机createSurfaceView();  //初始化SurfaceHoldersetLightOn(); //打开手电
}private void initCamera() {try {mCamera = Camera.open();} catch (Exception e) {mCamera = null;}if (mCamera == null) {mIsAvailable = false;} else {mIsAvailable = true;}
}private void setLightOn() {if (mCamera == null) {return;}try {// 防止startPreview、setParameters抛出RuntimeException异常导致崩溃Camera.Parameters param = mCamera.getParameters();param.setFlashMode(Parameters.FLASH_MODE_TORCH);mCamera.setParameters(param);mCamera.setPreviewDisplay(mHolder);mCamera.startPreview();} catch (Exception e) {powerOff();return;}
}public void powerOff() {
//关闭手电,手电使用结束后必须释放camera资源,否则会造成内存泄露setLightOff();//关灯并释放资源if (mCamera != null) { //保护mCamera.stopPreview();mCamera.release();mCamera = null;}removeSurfaceView(); //释放SurfaceHodler
}private void setLightOff() {if (mCamera == null) {return;}try {// 防止startPreview、setParameters抛出RuntimeException异常导致崩溃Camera.Parameters param = mCamera.getParameters();param.setFlashMode(Parameters.FLASH_MODE_OFF);mCamera.setParameters(param);mCamera.stopPreview();mCamera.release();} catch (RuntimeException e) {e.printStackTrace();mCamera.stopPreview();mCamera.release();}mCamera = null;mIsLight = false;
}private void removeSurfaceView() {if (mFlashTorchSurface != null) {mWindowManager.removeViewImmediate(mFlashTorchSurface);mFlashTorchSurface = null;}
}

当然还要加上相关权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />

原地址:http://codesblock.com/blog/?p=56

Android手电筒(闪光灯)相关推荐

  1. android手电筒+闪光灯基本源码

    月黑风高,伸手不见五指,多么容易发生什么恐怖袭击啊!在网上下载的应用又有很烦人的各种各样的广告,不用担心,这里手把手叫你怎么做一个android的手电筒应用程序,用苹果和WP的请绕道,如果手机不带闪光 ...

  2. Android手电筒制作

    Android 手电筒制作 一.SystemUI中手电筒的控制 推荐:Android QuickSetting-手电筒控制 通过手机下拉状态栏,可以找到手电筒图标.也就是说SystemUI中存在控制手 ...

  3. android camera 闪光灯关闭,Android控制闪光灯的方法(打开与关闭)

    本文实例讲述了Android控制闪光灯的方法.分享给大家供大家参考,具体如下: 最近想做一个手电筒,在网上搜到一点资料 首先闪光灯可以用android.hardware.camera来控制 1. 在M ...

  4. android手电筒原理

    一.原理简介 现在android应用商店有许多的手电筒应用.其核心原理很简单,其实就是使用android中的摄像头类Camera控制控制闪光灯的亮灭.好了,接下来,一步步讲解下,android如何控制 ...

  5. android 手电筒_如何将您的Android手机用作手电筒

    android 手电筒 It's dark and you need to be able to see. It's fine-whip out your trusty Android phone a ...

  6. Android控制闪光灯的方法(打开与关闭)

    Android移动端操作系统 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名称, ...

  7. android 手电筒开关,Android实现手电筒电源键关闭功能

    说到Android手电筒电源键关闭功能,大家知道吗?其实客户要求点击电源按钮,手电筒需要关闭,今天爱站技术频道小编与您共享Android实现手电筒电源键关闭功能. frameworks\base\se ...

  8. android 自动闪光灯,Android 控制闪光灯

    这篇文章主要介绍了Android控制闪光灯的方法,可实现闪光灯打开与关闭的效果,涉及Android操作Camera闪光灯的相关技巧,需要的朋友可以参考下 最近项目中有涉及闪光灯的需求,所以就收集了下资 ...

  9. android 相机闪光灯和手电筒的使用

    在android项目中单独使用手电筒或者闪光灯是没有任何问题的.但是在你相机camera打开的时候再打开手电筒功能这时候就或多或少有问题.会报类似于这种错Fail to connect to came ...

  10. android 闪光灯 实现,android将闪光灯作为手电筒的实现代码

    手电筒是使用Android手机的闪光灯,所以需添加权限 import com.jwzhangjie.test.R; import android.app.Activity; import androi ...

最新文章

  1. 澄清大数据存储——系统集成商篇
  2. JZOJ 3453【NOIP2013中秋节模拟】连通块
  3. Spring JdbcTemplate+JdbcDaoSupport实例
  4. React开发(102):别写立即执行函数
  5. 信息学奥赛C++语言:百钱买百鸡
  6. 【信仰充值中心】Firefox 97 后续更新一览
  7. administrator用户不见了
  8. 《Algorithms》—— 链表实现栈,队列,背包
  9. Vmvare三种网络连接方式:桥接模式、NAT模式和HostOnly模式
  10. 如何用一行 CSS 实现 10 种现代布局?
  11. WEB 开发异常:java.lang.ClassNotFoundException
  12. Exchange 2016 CU9 已发布
  13. 将对象序列化为字符串
  14. 修改鼠标手形 闪烁 在填写文字内容后也一直在闪烁
  15. F2FS文件系统一 设计背景及框架结构
  16. android dpi 修改,DPI修改
  17. 生命也如同平常到化入夏风里的蝉鸣
  18. uniapp 微信小程序获取map地图中心的经纬度地理位置
  19. 软件测试真的是吃青春饭的吗?有哪些建议可以给刚入职的测试员?(全是干货)
  20. 十大不良习惯损害大脑

热门文章

  1. vue-axios的安装及四个常见方法
  2. pycharm注释方法
  3. 传奇4,掉线重连,无法连接服务器等情况解决方案
  4. Python 数字以规定格式化输出
  5. idea 翻译插件 网络错误问题 cn.yiiguxing.plugin.translate.trans.TranslateException: Google 翻译 :: 翻译失败: 网络错误
  6. excel跨多个表格求和_一个小小的米字符号,在Excel中起到关键作用,搭配任何函数使用...
  7. 计算机应用如何分段和合并段落,计算机一级WPSOffice考试:轻松调整段落布局
  8. Mybatis-plus LambdaQueryWrapper 模糊查询 like方法使用记录
  9. linux系统禁用显卡,Ubuntu下禁用集成显卡
  10. python怎么定义正方形函数_python之函数的定义