android手电筒+闪光灯基本源码
月黑风高,伸手不见五指,多么容易发生什么恐怖袭击啊!在网上下载的应用又有很烦人的各种各样的广告,不用担心,这里手把手叫你怎么做一个android的手电筒应用程序,用苹果和WP的请绕道,如果手机不带闪光灯的可以先看看,下次买个新手机再体验一下,有图有真相,先上图:
准备:带闪光灯的手机一台,android开发环境
一、首先我们新建一个工程,命名FlashLight,给布局文件main.xml添加内容:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/cio" >
<ToggleButton
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="13dp"
android:layout_marginRight="60dp"
android:textOff="闪光关"
android:textOn="闪光开" />
<ToggleButton
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button2"
android:layout_alignBottom="@+id/button2"
android:layout_alignParentLeft="true"
android:layout_marginLeft="52dp"
android:textOff="手电关"
android:textOn="手电开" />
</RelativeLayout>
在这个工程里面我们简单的用ToggleButton来实现功能,你可以选择自己喜欢的组件来完成。
二、在activity中实现功能,简单介绍一下,android的手电筒功能实际上就是控制闪光灯的开与关,不断闪动则是通过一个线程不断的开、关来实现的,很简单,上代码:
public class MainActivity extends Activity
{
private static final String TAG = "MainActivity";
private Camera mCamera;
private Camera.Parameters parameters;
private long mExitTime = 0;
private ToggleButton mTbtnLight,mTbtnFlashlight;
public static final int OPEN_LIGHT = 0x0010;
public static final int CLOSE_LIGHT = 0x0020;
private FlightThread flightThread;
private OnCheckedChangeListener mChangeListener = new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
openLight();
}
else
{
closeLight();
}
}
};
private OnCheckedChangeListener mFlashListener = new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
// 开始循环
isStart = true;
}
else
{
isStart = false;
closeLight();
}
}
};
public Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case OPEN_LIGHT:
openLight();
break;
case CLOSE_LIGHT:
closeLight();
break;
case 1000:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
initValue();
flightThread = new FlightThread();
flightThread.start();
}
private void initValue()
{
mCamera = Camera.open();
mTbtnLight = (ToggleButton)findViewById(R.id.button1);
mTbtnFlashlight = (ToggleButton)findViewById(R.id.button2);
parameters = mCamera.getParameters();
mTbtnLight.setSelected(false);
mTbtnFlashlight.setSelected(false);
mTbtnLight.setOnCheckedChangeListener(mChangeListener);
mTbtnFlashlight.setOnCheckedChangeListener(mFlashListener);
}
/**
* 打开手电
* @author jetsen-ZhongHeliang 2014年1月21日 下午6:03:01
*/
private void openLight()
{
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
/**
* 关闭手电
* @author jetsen-ZhongHeliang 2014年1月21日 下午6:03:22
*/
private void closeLight()
{
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
}
boolean isStart = false;
int i = 0;
class FlightThread extends Thread
{
@Override
public void run()
{
while (true)
{
while (isStart)
{
if (i++ %2 == 0)
{
mHandler.obtainMessage(OPEN_LIGHT).sendToTarget();
}
else
{
mHandler.obtainMessage(CLOSE_LIGHT).sendToTarget();
}
try
{
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_BACK:
// 这里穿插一个很简单的双击退出的功能,有点意思
if ((System.currentTimeMillis() - mExitTime) > 2000)
{
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
mExitTime = System.currentTimeMillis();
}
else
{
finish();
}
return true;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onDestroy()
{
mCamera.release();
flightThread.interrupt();
super.onDestroy();
}
}
三、最后,不要忘了加权限,在AndroidManifest.xml文件中添加如下权限
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
完成上面三个步骤就可以实现一个毫无广告的自己DIY的手电功能,背景啊应用名字啊随便自己换。
android手电筒+闪光灯基本源码相关推荐
- Android系统所有版本源码Kernel源码
传送门: https://www.androidos.net.cn/sourcecode 最近在弄插件化的相关内容,但是发现自己真的很渺小,DroidPlugin支持的android版本真的很低,所以 ...
- Android 开启闪光灯做手电筒 源码
权限:<uses-permission android:name="android.permission.FLASHLIGHT" /><uses-permissi ...
- Android基础---学习历程【上课用到的资源---学期!汇总!整理】【课本源码、课后习题答案、上课课件与录播】
专业课 名:Android开发基础A 2020年 上半年[大二下学期]学的. 目 录 推荐博客 学习帮助文档(必看) 课本(Android 移动开发基础 案例教程) 课本源码and课后习 ...
- 简易日历记事本源码(java+android端),含日历和日志记事本两部分
DuangCalender 简易日历记事本(java+android端) 完整代码下载地址:简易日历记事本源码(java+android端) 1.本设计题目的主要内容 JAVA: duang日历记事本 ...
- Android手电筒制作
Android 手电筒制作 一.SystemUI中手电筒的控制 推荐:Android QuickSetting-手电筒控制 通过手机下拉状态栏,可以找到手电筒图标.也就是说SystemUI中存在控制手 ...
- 【Android】条形码/二维码扫描——ZXing源码分析及相关jar包导入
转载自:http://blog.csdn.net/u010574567/article/details/51916604 *********************1.源码分析************ ...
- android手电筒原理
一.原理简介 现在android应用商店有许多的手电筒应用.其核心原理很简单,其实就是使用android中的摄像头类Camera控制控制闪光灯的亮灭.好了,接下来,一步步讲解下,android如何控制 ...
- Android实用应用程序源码
andriod闹钟源代码 http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序 http://www.apkbus.com/an ...
- Ubuntu10下载安装Android 2.2 froyo 源码
ubuntu安装jdk全过程(仅供参考) http://forum.ubuntu.org.cn/viewtopic.php?t=183803 在android 编译中要是用的是 jdk 1.5,下面的 ...
最新文章
- Android Cordova 对于软键盘弹出后覆盖输入域的解决
- python中一共有多少个关键字-Python中所有的关键字
- leetcode算法题--仅仅反转字母
- Python 技巧篇-字符串灵活处理:字符串过滤、字符串拼接,字符串切片,特殊、超长字符串的处理实例演示
- 为什么字节跳动选择使用 Go 语言?
- 我终于搞清楚了和String有关的那点事儿
- 【词云】wordcloud安装与使用
- 六妙招让死钱变活钱[转]
- python文件打开的合法方式-用python与文件进行交互的方法
- vi删除选中内容_如何优雅的删除代码-VIM
- Vue解决接口访问跨域问题
- [转]Linux芯片级移植与底层驱动(基于3.7.4内核)
- VBS中Sub与Function的区别[资料]
- springboot整合J2cache简单使用
- 如何用计算机做大爆炸模拟,法国完成首个宇宙结构计算机模型 模拟大爆炸至今...
- scrapy爬虫之爬取百度手机助手app信息并保存至mongodb数据库(附源码)
- 计算机基础及ms office应用,计算机基础及MS OFFICE应用(2020年版)/全国计算机等级考试一级教程...
- 【期末复习】操作系统
- 苹果cms的php.ini,苹果cms伪静态设置教程
- shell笔记本xmind导出
热门文章
- 《微信小程序案例8》实现聊天框下部分别人向我发消息
- REDIS启动出错的原因
- JavaWeb数据交互前后台[Java+JSP+MySql+tomcat] 仿12306购票系统前台和后台(一)项目介绍以及需求分析
- go安装mysql驱动,连接mysql
- 试验箱开展维修保养时很容易忽略的地区
- 热血军团-targetFrameRate
- i5-1035G7性能怎么样 i5-1035G7 相当于什么水平
- 考虑体积重量的装箱问题(贪婪策略装箱)—— 基于遗传算法
- 飞镖 501 分最快完成比赛法(完美比赛方案)(9镖)
- 阴阳师同服务器不同系统,阴阳师跨系统转角色怎么转?跨系统转介绍服务介绍!...