手电筒功能实现简单很实用,下面我们就来研究一下如何自制一款手电筒小程序,初学者可以通过实例了解原理,提高学习android技术的热情和动力。
首先我们了解一下手电筒要调用哪些android权限:
- <!-- 打开Camera的权限 -->
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-feature android:name="android.hardware.camera" />
- <uses-feature android:name="android.hardware.autofocus" />
- <!-- 开启闪光灯权限 -->
- <uses-permission android:name="android.permission.FLASHLIGHT" />
- <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
下面看一下MainActivity.java:
- package com.zxx1.light;
- import android.app.Activity;
- import android.hardware.Camera;
- import android.hardware.Camera.Parameters;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.Button;
- import android.widget.Toast;
- public class LightActivity extends Activity {
- private Button lightBtn = null;
- private Camera camera = null;
- private Parameters parameters = null;
- public static boolean isLight = true; // 定义开关状态,状态为false,打开状态,状态为true,关闭状态
- private int back = 0;//
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 全屏设置,隐藏窗口所有装饰
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置屏幕显示无标题,必须启动就要设置好,否则不能再次被设置
- 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);
- lightBtn = (Button) findViewById(R.id.btn_light);
- lightBtn.setOnClickListener(new OnClickListenerImpl());
- }
- class OnClickListenerImpl implements OnClickListener {
- @Override
- public void onClick(View v) {
- if (isLight) {
- lightBtn.setBackgroundResource(R.drawable.shou_on);// 设置不同图片
- camera = Camera.open();// 打开闪光灯
- parameters = camera.getParameters();
- parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);// 开启
- camera.setParameters(parameters);
- camera.startPreview();// 开启
- isLight = false;
- } else {
- lightBtn.setBackgroundResource(R.drawable.shou_off);
- parameters.setFlashMode(Parameters.FLASH_MODE_OFF);// 关闭
- camera.setParameters(parameters);
- camera.stopPreview();
- isLight = true;
- camera.release();
- }
- }
- }
- @Override
- protected void onDestroy() {
- camera.release();
- super.onDestroy();
- }
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- back++;
- switch (back) {
- case 1:
- Toast.makeText(LightActivity.this, getString(R.string.again_exit), Toast.LENGTH_SHORT).show();
- break;
- case 2:
- back = 0;
- DulBack();
- break;
- }
- return true;
- } else {
- return super.onKeyDown(keyCode, event);
- }
- }
- public void DulBack() { // 关闭程序
- if (isLight) {// 开关关闭时
- LightActivity.this.finish();
- android.os.Process.killProcess(android.os.Process.myPid());// 关闭进程
- } else if (!isLight) {// 开关打开时
- camera.release();
- LightActivity.this.finish();
- android.os.Process.killProcess(android.os.Process.myPid());// 关闭进程
- isLight = true;// 避免,打开开关后退出程序,再次进入不打开开关直接退出时,程序错误
- }
- }
- }
布局文件如下:
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/relativelayout"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" >
- <Button
- android:id="@+id/btn_light"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_centerVertical="true"
- android:background="@drawable/shou_off" />
- </RelativeLayout>
最后别忘了配置权限,最后运行实例如下: