之前在项目中开发了一个手电筒应用,今天就拿出来给大家分享一下。

应用的架构很简单,就单纯的一个布局加一个主Activity,那么先来看一下资源图片有那些。

最后一张是桌面菜单图标,倒数第二张是透明的一个按钮图标。第一张和第二张分别是手电筒打开和关闭的资源图片。好了,然后来看一下文件的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg_flashlight"><RelativeLayoutandroid:id="@+id/bg_image"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:background="@drawable/bg_flashlight_off" ><ImageViewandroid:id="@+id/btn_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="148dp"android:src="@drawable/btn_flash_light" /></RelativeLayout></RelativeLayout>

大家应该能够看出来,手电筒点击进入的首次状态是打开的。最后看一下最关键的控制代码:

package com.example.flashlight;import java.util.List;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.Vibrator;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.app.Activity;
import android.content.Context;public class MainActivity extends Activity implements OnClickListener {private static final String TAG = "hello";public ImageView btnimageView = null;public RelativeLayout bgmageView = null;private Camera camera;private boolean isOpen = true;public final static int OPEN_CAMEERA = 1011; public final static int OPEN_LIGHT = 1012;public final static int CLOSE_LIGHT = 1013;private Vibrator vibrator;//振动器private Thread newThread;private boolean isTrue =  true;private long mExitTime = 0;long []pattern = {100,200};//等待0.1秒后 振动0.2秒PowerManager.WakeLock wakeLock;//保持屏幕恒亮private boolean mCameraFinish = false;  private Object mLock = new Object();@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉状态栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.main);vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);btnimageView = (ImageView) findViewById(R.id.btn_image);bgmageView = (RelativeLayout) findViewById(R.id.bg_image);bgmageView.setBackgroundResource(R.drawable.bg_flashlight_off);btnimageView.setImageResource(R.drawable.btn_flash_light);btnimageView.setOnClickListener(this);bgmageView.setBackgroundResource(R.drawable.bg_flashlight);btnimageView.setImageResource(R.drawable.btn_flash_light);vibrator.vibrate(pattern, -1);newThread = new Thread(){public void run(){Log.i(TAG, "camera open start");synchronized(mLock){if(mCameraFinish){return;                   }camera = Camera.open();//打开照相机if(camera != null){Parameters params = camera.getParameters();//掉用闪光灯List<String> list = params.getSupportedFlashModes();if(list.contains(Parameters.FLASH_MODE_TORCH)){params.setFlashMode(Parameters.FLASH_MODE_TORCH);//设置照相机参数FLASH_MODE_TORCH  持续的亮灯  }else{Toast.makeText(getApplicationContext(), "此设备不支持闪光灯模式",Toast.LENGTH_SHORT).show();}camera.setParameters(params);camera.startPreview();//开始亮灯  isOpen = true;}}Log.i(TAG, "camera open end camera = "+camera);}};    newThread.start();  }Handler handler = new Handler(Looper.getMainLooper()){public void handleMessage(Message msg){switch (msg.what) {case OPEN_CAMEERA:camera = Camera.open();//打开照相机break;case OPEN_LIGHT:synchronized(mLock){if(camera != null){Parameters params = camera.getParameters();//掉用闪光灯List<String> list = params.getSupportedFlashModes();if(list.contains(Parameters.FLASH_MODE_TORCH)){params.setFlashMode(Parameters.FLASH_MODE_TORCH);//设置照相机参数FLASH_MODE_TORCH  持续的亮灯  }else{Toast.makeText(getApplicationContext(), "此设备不支持闪光灯模式",Toast.LENGTH_SHORT).show();}camera.setParameters(params);camera.startPreview();//开始亮灯  isOpen = true;}}break;case CLOSE_LIGHT:synchronized(mLock){if(isOpen){if(camera != null){Parameters closeParameters = camera.getParameters();closeParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);camera.setParameters(closeParameters);camera.stopPreview();//关掉灯isOpen = false;}}}break;default:break;}}};@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_image:Log.i("lyj_tag", "isOpen = "+isOpen);synchronized(mLock){if(isOpen){bgmageView.setBackgroundResource(R.drawable.bg_flashlight_off);btnimageView.setImageResource(R.drawable.btn_flash_light);handler.sendEmptyMessage(CLOSE_LIGHT);vibrator.vibrate(pattern, -1);}else{bgmageView.setBackgroundResource(R.drawable.bg_flashlight);btnimageView.setImageResource(R.drawable.btn_flash_light);handler.sendEmptyMessage(OPEN_LIGHT);vibrator.vibrate(pattern, -1);}}break;default:break;}}protected void onDestroy(){super.onDestroy();releaseCamera();}public void releaseCamera(){synchronized(mLock){if(camera != null){camera.release();camera = null;}         }       }   public void onStop(){super.onStop();vibrator.cancel();releaseCamera();}protected void onResume(){super.onResume();//启用屏幕常亮功能PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE,"test");wakeLock.acquire();}protected void onPause(){super.onPause();Log.i(TAG, "onPause  Thread end");if(wakeLock != null){wakeLock.release();Log.i(TAG, "onPause  wakeLock end");}一定要释放Camera,否则会导致手机屏幕不能主动灭屏releaseCamera();finish();}public boolean onKeyDown(int keyCode, KeyEvent event){if(keyCode == KeyEvent.KEYCODE_BACK){//按back键的时候 释放照相机synchronized(mLock){if(camera != null){releaseCamera();}else{//mCameraRelease = false;}mCameraFinish = true;}}if(keyCode == KeyEvent.KEYCODE_HOME){//按home键的时候 释放照相机synchronized(mLock){if(camera != null){releaseCamera();finish();}else{//mCameraRelease = false;}mCameraFinish = true;}}return  super.onKeyDown(keyCode, event);}}

对了,最后一定不要忘了在应用的AndroidManifest.xml文件中加上这些权限,否则应用会抛出异常。

    <!-- 设置权限  --><uses-permission android:name="android.permission.CAMERA"/><uses-permission android:name="android.permission.FLASHLIGHT"/><uses-permission android:name="android.permission.VIBRATE"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-feature android:name="android.hardware.camera"/>

代码关键的地方我都做了注释,看了代码后大家应该都能明白,需要说明的是:首次点击进入手电筒是打开的,按Back键后手电筒是关闭的,如果按Home键或者Power键,手电筒是保持常亮的。当然如果需要关闭的话稍微修改一下代码就可以了。好了,看一下手电筒打开和关闭的效果图:

Android手电筒开发相关推荐

  1. android 手电筒开发

    这是我的第一篇博文,希望大家喜欢和支持,看了别人很多博文以后 ,感觉那些技术大牛的博文都写的非常好,才开始决定自己也好写一写,让自己对已经掌握的东西系统的分析一遍,提高自己的表达能力. 先手先讲一下为 ...

  2. android 手电筒开发,Android之实现手电筒实例

    主要实现两个步骤: 1.实现打开和关闭闪光灯:而实现操作闪光灯主要通过Camera类 Camera camera = Camera.open(); Parameters mParameters = c ...

  3. android平台手电筒开发源代码

    android平台手电筒开发源代码,AndroidManifest.xml文件的入口是startapp,这个文件没上传上来,大家可以自己写. 1. [代码]android     jQuery特效 / ...

  4. 基于Android平台开发的手电筒Light

    基于Android平台开发的手电筒Light 1.     需求分析: 在现代社会中,手机的功能越来越完善,手电筒就是这些功能中必不可少的一种.当行走在漆黑的道路上,当你在黑暗狭小的地方寻找物品,当你 ...

  5. Android手电筒案例

    最近在学习Android的开发,写了个手电筒的案例,分享一下! //Activity.xml package com.fq.flashlight;import android.app.Activity ...

  6. android 手电筒服务,Android手电筒案例

    最近在学习Android的开发,写了个手电筒的案例,分享一下!//Activity.xml package com.fq.flashlight; import android.app.Activity ...

  7. Google Android SDK开发范例大全

    1. 图书信息: Google Android SDK开发范例大全(第2版)     人民邮电出版社 2010-6-1 0:00:00 余志龙;陈昱勋;郑名杰;陈小凤;郭秩均 79 元 ISBN:97 ...

  8. Android应用开发攻略

    <Android应用开发攻略> 基本信息 原书名:Android Cookbook 作者: (美)达尔文Ian F. Darwin [作译者介绍] 译者: 姚军 丛书名: O'Reilly ...

  9. Android WiFi开发教程(三)——WiFi热点数据传输

    在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)--WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...

最新文章

  1. 在cuDNN中简化Tensor Ops
  2. 【ACM】杭电OJ 2010
  3. inotify介绍及rsync + inotify 实时同步备份
  4. proc文件的简单读写
  5. PAT甲级1064 Complete Binary Search Tree (30分):[C++题解]完全二叉搜索树BST
  6. 收到了7封拒信的观后感哈哈哈哈哈哈哈哈哈哈
  7. MySQL函数大全 及用法示例
  8. linux搭建hdfs
  9. 55)PHP,在html嵌套PHP写法
  10. 利用gsoap工具,通过wsdl文件生成webservice的C++工程文件
  11. CSDN自定义模块内容编写
  12. Revit 2021 族样板下载
  13. 诺基亚N9手机升级后PR1.3后反应迟钝、发热、耗电快的问题
  14. 疯狂java 怎么样_《疯狂Java讲义》(一) ---- 关于学习Java的反思
  15. ENVI5.3.1使用Landsat 8影像进行监督分类实例操作
  16. java绘制坐标和波形图_java绘制波形图
  17. 英语十大词性之四 - 副词
  18. 动物棋c语言程序,斗兽棋游戏手机版|斗兽棋游戏下载 v0.2C 安卓版_最火软件站...
  19. 随笔 | “郑秋冬”随想
  20. 虚拟机NAT模式无法连外网

热门文章

  1. 表值函数和标量值函数
  2. ubuntu写yacc
  3. 100个C语言的编程题
  4. 计算机网络(4)传输层
  5. realsense d435i标定imu与camera
  6. 解决实例化servlet报错500
  7. 今天来详细说一说贴片三极管
  8. layui 日期选择器 laydate详细参数用法大全,一键复制粘贴
  9. 高中计算机必修选修知识点,新课标高中数学必修+选修全部知识点精华归纳总结...
  10. 新版白话空间统计(12):P值的表达以及空间统计上的特性