月黑风高,伸手不见五指,多么容易发生什么恐怖袭击啊!在网上下载的应用又有很烦人的各种各样的广告,不用担心,这里手把手叫你怎么做一个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手电筒+闪光灯基本源码相关推荐

  1. Android系统所有版本源码Kernel源码

    传送门: https://www.androidos.net.cn/sourcecode 最近在弄插件化的相关内容,但是发现自己真的很渺小,DroidPlugin支持的android版本真的很低,所以 ...

  2. Android 开启闪光灯做手电筒 源码

    权限:<uses-permission android:name="android.permission.FLASHLIGHT" /><uses-permissi ...

  3. Android基础---学习历程【上课用到的资源---学期!汇总!整理】【课本源码、课后习题答案、上课课件与录播】

    专业课 名:Android开发基础A      2020年 上半年[大二下学期]学的. 目   录 推荐博客 学习帮助文档(必看) 课本(Android 移动开发基础 案例教程) 课本源码and课后习 ...

  4. 简易日历记事本源码(java+android端),含日历和日志记事本两部分

    DuangCalender 简易日历记事本(java+android端) 完整代码下载地址:简易日历记事本源码(java+android端) 1.本设计题目的主要内容 JAVA: duang日历记事本 ...

  5. Android手电筒制作

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

  6. 【Android】条形码/二维码扫描——ZXing源码分析及相关jar包导入

    转载自:http://blog.csdn.net/u010574567/article/details/51916604 *********************1.源码分析************ ...

  7. android手电筒原理

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

  8. Android实用应用程序源码

    andriod闹钟源代码 http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序 http://www.apkbus.com/an ...

  9. Ubuntu10下载安装Android 2.2 froyo 源码

    ubuntu安装jdk全过程(仅供参考) http://forum.ubuntu.org.cn/viewtopic.php?t=183803 在android 编译中要是用的是 jdk 1.5,下面的 ...

最新文章

  1. Android Cordova 对于软键盘弹出后覆盖输入域的解决
  2. python中一共有多少个关键字-Python中所有的关键字
  3. leetcode算法题--仅仅反转字母
  4. Python 技巧篇-字符串灵活处理:字符串过滤、字符串拼接,字符串切片,特殊、超长字符串的处理实例演示
  5. 为什么字节跳动选择使用 Go 语言?
  6. 我终于搞清楚了和String有关的那点事儿
  7. 【词云】wordcloud安装与使用
  8. 六妙招让死钱变活钱[转]
  9. python文件打开的合法方式-用python与文件进行交互的方法
  10. vi删除选中内容_如何优雅的删除代码-VIM
  11. Vue解决接口访问跨域问题
  12. [转]Linux芯片级移植与底层驱动(基于3.7.4内核)
  13. VBS中Sub与Function的区别[资料]
  14. springboot整合J2cache简单使用
  15. 如何用计算机做大爆炸模拟,法国完成首个宇宙结构计算机模型 模拟大爆炸至今...
  16. scrapy爬虫之爬取百度手机助手app信息并保存至mongodb数据库(附源码)
  17. 计算机基础及ms office应用,计算机基础及MS OFFICE应用(2020年版)/全国计算机等级考试一级教程...
  18. 【期末复习】操作系统
  19. 苹果cms的php.ini,苹果cms伪静态设置教程
  20. shell笔记本xmind导出

热门文章

  1. 《微信小程序案例8》实现聊天框下部分别人向我发消息
  2. REDIS启动出错的原因
  3. JavaWeb数据交互前后台[Java+JSP+MySql+tomcat] 仿12306购票系统前台和后台(一)项目介绍以及需求分析
  4. go安装mysql驱动,连接mysql
  5. 试验箱开展维修保养时很容易忽略的地区
  6. 热血军团-targetFrameRate
  7. i5-1035G7性能怎么样 i5-1035G7 相当于什么水平
  8. 考虑体积重量的装箱问题(贪婪策略装箱)—— 基于遗传算法
  9. 飞镖 501 分最快完成比赛法(完美比赛方案)(9镖)
  10. 阴阳师同服务器不同系统,阴阳师跨系统转角色怎么转?跨系统转介绍服务介绍!...