Android手电筒(闪光灯)
百度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手电筒(闪光灯)相关推荐
- android手电筒+闪光灯基本源码
月黑风高,伸手不见五指,多么容易发生什么恐怖袭击啊!在网上下载的应用又有很烦人的各种各样的广告,不用担心,这里手把手叫你怎么做一个android的手电筒应用程序,用苹果和WP的请绕道,如果手机不带闪光 ...
- Android手电筒制作
Android 手电筒制作 一.SystemUI中手电筒的控制 推荐:Android QuickSetting-手电筒控制 通过手机下拉状态栏,可以找到手电筒图标.也就是说SystemUI中存在控制手 ...
- android camera 闪光灯关闭,Android控制闪光灯的方法(打开与关闭)
本文实例讲述了Android控制闪光灯的方法.分享给大家供大家参考,具体如下: 最近想做一个手电筒,在网上搜到一点资料 首先闪光灯可以用android.hardware.camera来控制 1. 在M ...
- android手电筒原理
一.原理简介 现在android应用商店有许多的手电筒应用.其核心原理很简单,其实就是使用android中的摄像头类Camera控制控制闪光灯的亮灭.好了,接下来,一步步讲解下,android如何控制 ...
- android 手电筒_如何将您的Android手机用作手电筒
android 手电筒 It's dark and you need to be able to see. It's fine-whip out your trusty Android phone a ...
- Android控制闪光灯的方法(打开与关闭)
Android移动端操作系统 Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名称, ...
- android 手电筒开关,Android实现手电筒电源键关闭功能
说到Android手电筒电源键关闭功能,大家知道吗?其实客户要求点击电源按钮,手电筒需要关闭,今天爱站技术频道小编与您共享Android实现手电筒电源键关闭功能. frameworks\base\se ...
- android 自动闪光灯,Android 控制闪光灯
这篇文章主要介绍了Android控制闪光灯的方法,可实现闪光灯打开与关闭的效果,涉及Android操作Camera闪光灯的相关技巧,需要的朋友可以参考下 最近项目中有涉及闪光灯的需求,所以就收集了下资 ...
- android 相机闪光灯和手电筒的使用
在android项目中单独使用手电筒或者闪光灯是没有任何问题的.但是在你相机camera打开的时候再打开手电筒功能这时候就或多或少有问题.会报类似于这种错Fail to connect to came ...
- android 闪光灯 实现,android将闪光灯作为手电筒的实现代码
手电筒是使用Android手机的闪光灯,所以需添加权限 import com.jwzhangjie.test.R; import android.app.Activity; import androi ...
最新文章
- 澄清大数据存储——系统集成商篇
- JZOJ 3453【NOIP2013中秋节模拟】连通块
- Spring JdbcTemplate+JdbcDaoSupport实例
- React开发(102):别写立即执行函数
- 信息学奥赛C++语言:百钱买百鸡
- 【信仰充值中心】Firefox 97 后续更新一览
- administrator用户不见了
- 《Algorithms》—— 链表实现栈,队列,背包
- Vmvare三种网络连接方式:桥接模式、NAT模式和HostOnly模式
- 如何用一行 CSS 实现 10 种现代布局?
- WEB 开发异常:java.lang.ClassNotFoundException
- Exchange 2016 CU9 已发布
- 将对象序列化为字符串
- 修改鼠标手形 闪烁 在填写文字内容后也一直在闪烁
- F2FS文件系统一 设计背景及框架结构
- android dpi 修改,DPI修改
- 生命也如同平常到化入夏风里的蝉鸣
- uniapp 微信小程序获取map地图中心的经纬度地理位置
- 软件测试真的是吃青春饭的吗?有哪些建议可以给刚入职的测试员?(全是干货)
- 十大不良习惯损害大脑
热门文章
- vue-axios的安装及四个常见方法
- pycharm注释方法
- 传奇4,掉线重连,无法连接服务器等情况解决方案
- Python 数字以规定格式化输出
- idea 翻译插件 网络错误问题 cn.yiiguxing.plugin.translate.trans.TranslateException: Google 翻译 :: 翻译失败: 网络错误
- excel跨多个表格求和_一个小小的米字符号,在Excel中起到关键作用,搭配任何函数使用...
- 计算机应用如何分段和合并段落,计算机一级WPSOffice考试:轻松调整段落布局
- Mybatis-plus LambdaQueryWrapper 模糊查询 like方法使用记录
- linux系统禁用显卡,Ubuntu下禁用集成显卡
- python怎么定义正方形函数_python之函数的定义