Android手电筒开发
之前在项目中开发了一个手电筒应用,今天就拿出来给大家分享一下。
应用的架构很简单,就单纯的一个布局加一个主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手电筒开发相关推荐
- android 手电筒开发
这是我的第一篇博文,希望大家喜欢和支持,看了别人很多博文以后 ,感觉那些技术大牛的博文都写的非常好,才开始决定自己也好写一写,让自己对已经掌握的东西系统的分析一遍,提高自己的表达能力. 先手先讲一下为 ...
- android 手电筒开发,Android之实现手电筒实例
主要实现两个步骤: 1.实现打开和关闭闪光灯:而实现操作闪光灯主要通过Camera类 Camera camera = Camera.open(); Parameters mParameters = c ...
- android平台手电筒开发源代码
android平台手电筒开发源代码,AndroidManifest.xml文件的入口是startapp,这个文件没上传上来,大家可以自己写. 1. [代码]android jQuery特效 / ...
- 基于Android平台开发的手电筒Light
基于Android平台开发的手电筒Light 1. 需求分析: 在现代社会中,手机的功能越来越完善,手电筒就是这些功能中必不可少的一种.当行走在漆黑的道路上,当你在黑暗狭小的地方寻找物品,当你 ...
- Android手电筒案例
最近在学习Android的开发,写了个手电筒的案例,分享一下! //Activity.xml package com.fq.flashlight;import android.app.Activity ...
- android 手电筒服务,Android手电筒案例
最近在学习Android的开发,写了个手电筒的案例,分享一下!//Activity.xml package com.fq.flashlight; import android.app.Activity ...
- Google Android SDK开发范例大全
1. 图书信息: Google Android SDK开发范例大全(第2版) 人民邮电出版社 2010-6-1 0:00:00 余志龙;陈昱勋;郑名杰;陈小凤;郭秩均 79 元 ISBN:97 ...
- Android应用开发攻略
<Android应用开发攻略> 基本信息 原书名:Android Cookbook 作者: (美)达尔文Ian F. Darwin [作译者介绍] 译者: 姚军 丛书名: O'Reilly ...
- Android WiFi开发教程(三)——WiFi热点数据传输
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)--WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...
最新文章
- 在cuDNN中简化Tensor Ops
- 【ACM】杭电OJ 2010
- inotify介绍及rsync + inotify 实时同步备份
- proc文件的简单读写
- PAT甲级1064 Complete Binary Search Tree (30分):[C++题解]完全二叉搜索树BST
- 收到了7封拒信的观后感哈哈哈哈哈哈哈哈哈哈
- MySQL函数大全 及用法示例
- linux搭建hdfs
- 55)PHP,在html嵌套PHP写法
- 利用gsoap工具,通过wsdl文件生成webservice的C++工程文件
- CSDN自定义模块内容编写
- Revit 2021 族样板下载
- 诺基亚N9手机升级后PR1.3后反应迟钝、发热、耗电快的问题
- 疯狂java 怎么样_《疯狂Java讲义》(一) ---- 关于学习Java的反思
- ENVI5.3.1使用Landsat 8影像进行监督分类实例操作
- java绘制坐标和波形图_java绘制波形图
- 英语十大词性之四 - 副词
- 动物棋c语言程序,斗兽棋游戏手机版|斗兽棋游戏下载 v0.2C 安卓版_最火软件站...
- 随笔 | “郑秋冬”随想
- 虚拟机NAT模式无法连外网