手电筒功能实现简单很实用,下面我们就来研究一下如何自制一款手电筒小程序,初学者可以通过实例了解原理,提高学习android技术的热情和动力。

首先我们了解一下手电筒要调用哪些android权限:

[html]  view plain copy
  1. <!-- 打开Camera的权限 -->
  2. <uses-permission android:name="android.permission.CAMERA" />
  3. <uses-feature android:name="android.hardware.camera" />
  4. <uses-feature android:name="android.hardware.autofocus" />
  5. <!-- 开启闪光灯权限 -->
  6. <uses-permission android:name="android.permission.FLASHLIGHT" />
  7. <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

上面三个是摄像头权限,下面两个是闪光灯权限,在本实例中都要配置一下。

下面看一下MainActivity.java:

[java]  view plain copy
  1. package com.zxx1.light;
  2. import android.app.Activity;
  3. import android.hardware.Camera;
  4. import android.hardware.Camera.Parameters;
  5. import android.os.Bundle;
  6. import android.view.KeyEvent;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.Window;
  10. import android.view.WindowManager;
  11. import android.widget.Button;
  12. import android.widget.Toast;
  13. public class LightActivity extends Activity {
  14. private Button lightBtn = null;
  15. private Camera camera = null;
  16. private Parameters parameters = null;
  17. public static boolean isLight = true; // 定义开关状态,状态为false,打开状态,状态为true,关闭状态
  18. private int back = 0;//
  19. @Override
  20. public void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. // 全屏设置,隐藏窗口所有装饰
  23. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  24. requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置屏幕显示无标题,必须启动就要设置好,否则不能再次被设置
  25. getWindow().setFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
  26. WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
  27. getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
  28. WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//保持屏幕常亮
  29. setContentView(R.layout.main);
  30. lightBtn = (Button) findViewById(R.id.btn_light);
  31. lightBtn.setOnClickListener(new OnClickListenerImpl());
  32. }
  33. class OnClickListenerImpl implements OnClickListener {
  34. @Override
  35. public void onClick(View v) {
  36. if (isLight) {
  37. lightBtn.setBackgroundResource(R.drawable.shou_on);// 设置不同图片
  38. camera = Camera.open();// 打开闪光灯
  39. parameters = camera.getParameters();
  40. parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);// 开启
  41. camera.setParameters(parameters);
  42. camera.startPreview();// 开启
  43. isLight = false;
  44. } else {
  45. lightBtn.setBackgroundResource(R.drawable.shou_off);
  46. parameters.setFlashMode(Parameters.FLASH_MODE_OFF);// 关闭
  47. camera.setParameters(parameters);
  48. camera.stopPreview();
  49. isLight = true;
  50. camera.release();
  51. }
  52. }
  53. }
  54. @Override
  55. protected void onDestroy() {
  56. camera.release();
  57. super.onDestroy();
  58. }
  59. @Override
  60. public boolean onKeyDown(int keyCode, KeyEvent event) {
  61. if (keyCode == KeyEvent.KEYCODE_BACK) {
  62. back++;
  63. switch (back) {
  64. case 1:
  65. Toast.makeText(LightActivity.this, getString(R.string.again_exit), Toast.LENGTH_SHORT).show();
  66. break;
  67. case 2:
  68. back = 0;
  69. DulBack();
  70. break;
  71. }
  72. return true;
  73. } else {
  74. return super.onKeyDown(keyCode, event);
  75. }
  76. }
  77. public void DulBack() { // 关闭程序
  78. if (isLight) {// 开关关闭时
  79. LightActivity.this.finish();
  80. android.os.Process.killProcess(android.os.Process.myPid());// 关闭进程
  81. } else if (!isLight) {// 开关打开时
  82. camera.release();
  83. LightActivity.this.finish();
  84. android.os.Process.killProcess(android.os.Process.myPid());// 关闭进程
  85. isLight = true;// 避免,打开开关后退出程序,再次进入不打开开关直接退出时,程序错误
  86. }
  87. }
  88. }

布局文件如下:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/relativelayout"
  4. android:layout_width="wrap_content"
  5. android:layout_height="wrap_content" >
  6. <Button
  7. android:id="@+id/btn_light"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_centerHorizontal="true"
  11. android:layout_centerVertical="true"
  12. android:background="@drawable/shou_off" />
  13. </RelativeLayout>

最后别忘了配置权限,最后运行实例如下:

Android实战简易教程五十七(分享小米手电筒源码)相关推荐

  1. Android实战简易教程-第五十七枪(分享小米手电筒源码)

    手电筒功能实现简单很实用,下面我们就来研究一下如何自制一款手电筒小程序,初学者可以通过实例了解原理,提高学习android技术的热情和动力. 首先我们了解一下手电筒要调用哪些android权限: &l ...

  2. Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)

    前段时间写过一篇文章:Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)有的同学留言建议,可不可以动态控制checkbox的显示和全选反选功能,我研究了一下,发现实现也比较容 ...

  3. Android实战简易教程-第三十九枪(第三方短信验证平台Mob和验证码自动填入功能结合实例)

    用户注册或者找回密码时一般会用到短信验证功能,这里我们使用第三方的短信平台进行验证实例. 我们用到第三方短信验证平台是Mob,地址为:http://mob.com/ 一.注册用户.获取SDK 大家可以 ...

  4. Android实战简易教程-第六十枪(分享一个城市选择功能模块)

    在做一些APP的时候可能会用到城市选择模块的功能,本实例可以提供位置自定定位和手动选择的功能,非常好用,大家可以修改后加入自己的项目中. 首先看一下效果: 1.进入有的手机可能会提示权限要求,这时我们 ...

  5. Android实战简易教程-第六十五枪(自定义控件实现数字液晶时钟Demo)

    下面我们研究一下如何实现一个数字液晶时钟,本质属于特效一种哈. 首先创建一个布局文件: <?xml version="1.0" encoding="utf-8&qu ...

  6. Android实战简易教程-第六十六枪(服务器端搭建和服务器端Json数据交互)

    学习Android有一段时间了,对服务器端有很深的好奇,决定对服务器端的实现进行一些研究,这里实现了一个简单的小例子,用于获取服务器端的json数据,例子很简单,适合初学者学习使用. 服务器端 首先我 ...

  7. Android实战简易教程-第五十枪(工具类的测试)

    在开发中,为了提高开发效率,我们一般会自定义自己的工具类.为了保证项目的可靠性,在将工具类引入项目之前,我们一般都会对工具类进行单元测试,下面我们通过一个实例看一下如何搭建测试环境. 1.首先自定义一 ...

  8. Android实战简易教程-第七十五枪(WIFI直连工具类)

    设置指定的WIFI用户名密码和加密方式,可以进行WIFI直连. 1.工具类-WifiUtil.java: package demo.androidwar.com.myapplication;impor ...

  9. Android实战简易教程-第三十四枪(基于ViewPager和FragmentPagerAdapter实现滑动通用Tab)...

    上一段时间写过一篇文章<基于ViewPager实现微信页面切换效果> 里面实现了相似微信Tab的页面.可是这样的实现方法有个问题.就是以后全部的代码逻辑都必须在MainActivity中实 ...

最新文章

  1. pl/sql 报ORA-12154: TNS:无法解析指定的连接标志符
  2. oracle rac 图形化界面,oracle 10g rac配置vipca进不了图形界面,请高手帮忙分析下
  3. java程序错误类型及异常处理
  4. Python零基础学习笔记(十三)—— if 和 if-else语句...
  5. 微信开发基础 获取用户OpenID 列表
  6. 【学神-RHEL7】1-3-Linux基本命令和配置服务器来电后自动开机
  7. Leetcode每日一题:1248.count-number-of-nice-subarrays(统计[优美子数组])
  8. iOS和js交互三部曲,很不错的文章和demo
  9. Map与数组、对象之间的转换
  10. 如何用C语言实现批量修改文件类型
  11. win11安装更新错误0x800f081f怎么解决?
  12. 基于epoll,socket与protobuf的简单帧同步游戏服务器
  13. hive中reduce类函数说明
  14. LWN:终于能够防护 straight-line 预测执行漏洞了!
  15. Object-based superresolution land cover Mapping From Remotely sensed imagery
  16. 物联网新零售项目 订单支付与出货控制
  17. 【例题 7-11 UVA - 12325】Zombie's Treasure Chest
  18. 如何用chrome调试android应用程序,用Chrome调试你的android应用
  19. 3d游戏建模可以自学吗?小白教程
  20. springboot(三):连接mysql数据库

热门文章

  1. Ubuntu下安装并复现HAWQ3全流程+ImageNet完整数据集的处理
  2. 2023-03-04 java 主函数main和测试函数test,还有调用函数(在主函数里面调用其他的函数)
  3. 常见HTTP状态码汇总
  4. 【解题周报】week1 解题周报
  5. uniapp小程序实现弹幕功能
  6. U盘容量显示错误修改
  7. QT中学习Opengl---(纹理环绕方式与过滤)
  8. 【Python学习笔记】- 04 文件操作
  9. 伺服调试的一些应用总结
  10. 社区物业管理系统复盘