Android 手电筒源代码
近期因为公司须要,做了一个手电筒,事实上手电筒原理非常easy,就是调用照相机的闪光灯,控制闪光灯的开关,就能够实现手电筒的效果,
强调一下,代码中一定要注意在结束的时候对闪光灯进行释放,否则就会导致使用照相机的时候出现——无法连接到相机 这个问题
手电筒APK下载地址:点击打开下载链接
手电筒项目源代码下载:点击打开下载链接
主要代码例如以下:
package com.techainsh.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.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener { public ImageView btnimageView = null;
public RelativeLayout bgmageView = null;
private Camera camera;
private boolean isOpen = true;
public final static int OPEN_CAMERA = 1011;
public final static int OPEN_LIGHT = 1012;
public final static int CLOSE_LIGHT = 1013;
private Vibrator vibrator;
long[] pattern = { 100, 200 };
PowerManager.WakeLock wakeLock; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.sendEmptyMessage(OPEN_CAMERA);
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_off);
btnimageView.setOnClickListener(this);
bgmageView.setBackgroundResource(R.drawable.bg_flashlight_on);
btnimageView.setImageResource(R.drawable.btn_flash_light_on);
handler.sendEmptyMessage(OPEN_LIGHT);
vibrator.vibrate(pattern, -1); } Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case OPEN_CAMERA:
camera = Camera.open();
break;
case OPEN_LIGHT:
Parameters params = camera.getParameters();
List<String> list = params.getSupportedFlashModes();
if (list.contains(Parameters.FLASH_MODE_TORCH)) {
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
} else {
Toast.makeText(getApplicationContext(), "此设备不支持闪光灯模式",
Toast.LENGTH_SHORT).show();
}
camera.setParameters(params);
camera.startPreview();
isOpen = true;
break;
case CLOSE_LIGHT:
if (isOpen) {
Parameters closepParameters = camera.getParameters();
closepParameters
.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(closepParameters);
camera.stopPreview();
// camera.release();
isOpen = false;
// sendEmptyMessage(OPEN_CAMERA);
}
break;
default:
break;
}
}
}; @Override
protected void onDestroy() {
super.onDestroy();
if (null != camera) {
camera.release();
camera = null;
}
} public void onStop() {
super.onStop();
vibrator.cancel();
if (null != camera) {
camera.release();
camera = null;
} MainActivity.this.finish();
} @Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE, "test");
wakeLock.acquire();
} @Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (wakeLock != null)
wakeLock.release();
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_image:
if (isOpen) {
bgmageView.setBackgroundResource(R.drawable.bg_flashlight_off);
btnimageView.setImageResource(R.drawable.btn_flash_light_off);
handler.sendEmptyMessage(CLOSE_LIGHT);
vibrator.vibrate(pattern, -1);
} else {
bgmageView.setBackgroundResource(R.drawable.bg_flashlight_on);
btnimageView.setImageResource(R.drawable.btn_flash_light_on);
handler.sendEmptyMessage(OPEN_LIGHT);
vibrator.vibrate(pattern, -1);
}
break;
default:
break;
} } }
须要用到的权限例如以下:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
界面布局例如以下:
<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/bg_flashlight" > <RelativeLayout
android:id="@+id/bg_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_flashlight_off" > <ImageView
android:id="@+id/btn_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="100dip"
android:src="@drawable/btn_flash_light_on" />
</RelativeLayout> </RelativeLayout>
实现的效果例如以下:
Android 手电筒源代码的更多相关文章
- Android开发/源代码资源汇总
全网最全的Android游戏源代码汇总 mod=viewthread&tid=5080&fromuid=5" target="_blank">htt ...
- Android 消息处理源代码分析(1)
Android 消息处理源代码分析(1) 在Android中,通常被使用的消息队列的代码在文件夹\sources\android-22\android\os下,涉及到下面几个类文件 Handler.j ...
- Android菜鸟的成长笔记(5)——Android系统源代码你下载了吗?
原文:Android菜鸟的成长笔记(5)--Android系统源代码你下载了吗? 在上一篇中我们用Android系统源代码分析了我们前面写的代码,有的朋友可能就会问怎么才能下载到Google官方的源代 ...
- Android游戏源代码合集(主要是AndEngine和Libgdx的)
近期在网络上看到有网友抱怨Android游戏源代码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源代码,以Eclipseproject的形式配置好环境,再陆续发出(某引擎避嫌,不在此 ...
- 《Android系统源代码情景分析》连载回忆录:灵感之源
上个月,在花了一年半时间之后,写了55篇文章,分析完成了Chromium在Android上的实现,以及Android基于Chromium实现的WebView.学到了很多东西,不过也挺累的,平均不到两个 ...
- 【Android 系统开发】下载 编译 Android源代码 和 Android kernel源代码
下载Android源码简要流程 : a. 获取repo文件: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo ...
- Window 下载Android系统源代码
第一步:使用命令下载manifest文件夹 git clone https://aosp.tuna.tsinghua.edu.cn/ 第二步:进入文件夹,打开default.xml文件并找到自己要下载 ...
- Android HandlerThread 源代码分析
HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...
- Android HttpURLConnection源代码分析
Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...
随机推荐
- Laravel 程序架构设计思路:使用动作类
当我们谈论到应用程序的架构的时候,经常会问到一个经典的问题,那就是"这段代码应该放在哪里比较好". 因为 Laravel 是一个相当灵活的框架,所以要回答这个问题其实没那么容易.我 ...
- (四)HttpClient 使用代理 IP
第一节: HttpClient 使用代理 IP 在爬取网页的时候,有的目标站点有反爬虫机制,对于频繁访问站点以及规则性访问站点的行为,会采集屏蔽IP措施. 这时候,代理IP就派上用场了. 关于代理IP ...
- win7下weblogic安装与部署项目调试记录
下载 weblogic12c, 官网下载通用版本 安装 略 下载jdk jdk所有版本连接 http://www.oracle.com/technetwork/java/archive-13921 ...
- SonarQube的安装、配置与使用(windows)
onarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 准备工作: 1.jdk(不再介绍) 2.sonarqube:htt ...
- 20165203《Java程序设计》第四周学习总结
教材学习内容总结 第5章 子类与继承 子类的继承性 子类和父类在同一包中的继承性:子类继承父类中不是private的成员变量和方法作为自己的成员变量和方法 子类和父类不在同一包中的继承性:子类只继承父 ...
- [C++]返回最值元素
1 priority_queue C++中优先队列是一种特殊的队列,能够返回队列中优先级最大或者最小的元素,其内部是由堆实现的,个人认为这种方式使用更加直观. 1.1 返回vector中的最值元素 # ...
- C# TabControl 隐藏标签头(TabControl Hide Head)
TabControl控件,有时候需要动态显示一个或者多个标签页,如果只是显示一个标签页的时候不想显示标签头,所以有可能隐藏头部的需求. 如下代码可以实现 public Form1() { Initia ...
- 数据迁移之Sqoop
一 简介 Apache Sqoop(TM)是一种用于在Apache Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具 . 官方下载地址:http://www.apache.org ...
- 解析文本文件 "r" 与 "rb" 模式的区别(Python)
r,rb 那么在读文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r':默认值,表示从文件读取数据.'b':表示要读写二进制数据 2.读文件 进行读文件操作时,直到读到文档结束符(E ...
- Dijkstra-傻子也能看懂的迪杰斯特拉算法(转)
本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. 与Floyd-Warshall算法一样 ...