简单的手电筒程序(基于Camera类实现)
2015-06-12 15:15
477 查看
控制手机闪关灯按照思路大概有下面三种方法
1. 使用camera类控制闪光灯方法setFlashMode 进行操作
2. 通过JNI控制现有驱动节点(使用与三星手机,其他手机不确认)
3. 重新编写驱动代码,提供通用的控制节点,供上层应用调用实现
上图为效果图(后来才发现原来灯泡和手电筒是不一样的东西,囧), 使用ToggleButton类型button显得生动一点。
下面是“Read The Fucking Source Code”
源代码 请点击这里下载
代码逻辑很简单,就是通过调用camera的方法setFlashMode来进行开关flash,但是过程中发现有 FC, log如下
重现路径是:第一次打开应用,操作正常,如果按back key退出,再进入,就会有FC,如果是在内存管理中直接删除,在进入,就没问题
通过上面分析 ,问题就非常明显了,没有完全退出导致了问题的发生,故又重写onDestroy的方法解决问题
1. 使用camera类控制闪光灯方法setFlashMode 进行操作
2. 通过JNI控制现有驱动节点(使用与三星手机,其他手机不确认)
3. 重新编写驱动代码,提供通用的控制节点,供上层应用调用实现
Flash On | Flash Off |
下面是“Read The Fucking Source Code”
package com.saberhao.bulb; import android.hardware.Camera; import android.hardware.Camera.Parameters; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ToggleButton; import android.widget.CompoundButton.OnCheckedChangeListener; public class BulbSwitch extends Activity { ToggleButton tb; private Camera mCameraDevices; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bulb_switch); if(mCameraDevices == null) //获取camera实例 mCameraDevices = Camera.open(); mCameraDevices.startPreview(); tb = (ToggleButton)findViewById(R.id.BulbButton); tb.setOnCheckedChangeListener ( //listen to the button new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { setBulbState(isChecked); } } ); } @Override protected void onDestroy() { super.onDestroy(); if(mCameraDevices == null) return; // release the camera class mCameraDevices.stopPreview(); mCameraDevices.release(); mCameraDevices = null; } protected void setBulbState(boolean isChecked) { // TODO Auto-generated method stub ImageView iv=(ImageView)findViewById(R.id.ImageView); iv.setImageResource((isChecked)?R.drawable.bulb_on:R.drawable.bulb_off); Parameters mParameters = mCameraDevices.getParameters(); if(isChecked) // flash on mParameters.setFlashMode(Parameters.FLASH_MODE_TORCH); else // flash off mParameters.setFlashMode(Parameters.FLASH_MODE_OFF); mCameraDevices.setParameters(mParameters); ToggleButton tb=(ToggleButton)findViewById(R.id.BulbButton); tb.setChecked(isChecked); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.bulb_switch, menu); return true; } }
源代码 请点击这里下载
代码逻辑很简单,就是通过调用camera的方法setFlashMode来进行开关flash,但是过程中发现有 FC, log如下
重现路径是:第一次打开应用,操作正常,如果按back key退出,再进入,就会有FC,如果是在内存管理中直接删除,在进入,就没问题
通过上面分析 ,问题就非常明显了,没有完全退出导致了问题的发生,故又重写onDestroy的方法解决问题
相关文章推荐
- objective-c 中的关联介绍
- ios项目icon和default 等相关图标命名规则和大小设置
- objective-c 中的关联介绍
- case when出报表
- GRE写作范文结构思路
- SAT数学练习题及详细答案解析(5)
- Node开发这块目前比较理想的装配建议
- iOS 9允许开发者只为64位设备开发应用
- Ubuntu下SSH设置
- Java 8 Optional类深度解析
- FastDFS 5.04之IO读事件空转导致CPU空转
- 博弈のSG函数
- Android Studio新手完全指引
- 数据库读写分离(aop方式完整实现)
- java 最大线程数
- mkfs.ext4 磁盘分区
- combogrid翻页后保持显示内容为配置的textField解决办法
- Hibernate在MyEclipse中的配置
- 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11
- iOS block的用法 by -- 周傅琦君