Android 手电筒源码

最近由于公司需要,做了一个手电筒,其实手电筒原理很简单,就是调用照相机的闪光灯,控制闪光灯的开关,就可以实现手电筒的效果,

强调一下,代码中一定要注意在结束的时候对闪光灯进行释放,否则就会导致使用照相机的时候出现——无法连接到相机 这个问题

手电筒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 手电筒源码,码迷,mamicode.com

时间: 2024-10-25 22:32:27

Android 手电筒源码的相关文章

android手电筒源码

手电筒源码,也解决部分机型不适配问,自己写了一个手电筒的demo,刚开始只在个别手机上能够打开手电筒,baidu了很多次还是没有解决,最后反编译了一个手电筒的代码看了一下思路,哈哈,终于解决了,现在可以适配绝大多数机型.所以我要分享给大家.上图 <ignore_js_op> device-2014-05-03-164927.png (437.99 KB, 下载次数: 0) <ignore_js_op> 详细说明:http://android.662p.com/thread-5413

分享45个android实例源码,很好很强大

分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序http://www.apkbus.com/android-20973-1-1.html 重力感应的测试程序andriod源代码http://www.apkbus.com/android-20972-1-1.html

分享45个android实例源码,很好很强大.收藏吧!!!

andriod闹钟源代码http://www.apkbus.com/android-20974-1-1.htmlandroid源码分享之指南针程序http://www.apkbus.com/android-20973-1-1.html重力感应的测试程序andriod源代码http://www.apkbus.com/android-20972-1-1.htmlandroid源码分享之时光日志个人日程管理http://www.apkbus.com/android-20969-1-1.htmlOpen

45个android实例源码

分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序http://www.apkbus.com/android-20973-1-1.html 重力感应的测试程序andriod源代码http://www.apkbus.com/android-20972-1-1.html

45个android实例源码,很好很强大.收藏吧!!!

分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com/android-20974-1-1.html android源码分享之指南针程序http://www.apkbus.com/android-20973-1-1.html 重力感应的测试程序andriod源代码http://www.apkbus.com/android-20972-1-1.html

2016年最牛逼的分类Android项目源码免费一次性打包下载!

之前发过一个帖子,但是那个帖子有点问题我就重新发一个吧,下面的源码是我从今年开始不断整理源码区和其他网站上的安卓例子源码,目前总共有810套左右,根据实现的功能被我分成了100多个类,总共接近2.5G,还在不断更新.初学者可以快速方便的找到自己想要的例子,大神也可以看一下别人的方法实现.虽然的例子都是我一个人辛辛苦苦花了很多时间和精力整理的,但是既然这些例子是来自于社区那就让他们免费回归社区吧,(是的!特么的不要一分钱!最看不起那些挂羊头卖狗的)你可以在本帖里面按Ctrl+F查找你需要的关键字,

Android应用源码 概览

之前我讲过关于Android应用源码的使用,不要走弯路,没有用的源码不要深究. 记住目录就好. 这里还有很多源码, Javaapk这个网站里的.还有很多. 这些源码 有可能有用. 但是不必故意用它. 没有必要的. 比如 如果你有个想法,就是改一下像素鸟的界面,从而做一个新的 有趣的游戏, 这完全可以呀. 但是,要说 把这些源码 都修改,  完全没有必要的.没精力 也没必要.吃力不讨好.那不傻逼了么.

[Android]Fragment源码分析(一) 构造

Fragment是Android3.0之后提供的api,被大家广泛所熟知的主要原因还是因为随即附带的ViewPager控件.虽然我并不喜欢用它,但是它确实是一个相对不错的控件.还是我的一贯作风,我将从源码上向大家展示什么是Fragment.我们先写一个简单的代码对Fragment有个直观的认识:(为了保证我们方便调试,我们可以直接使用V4提供的源码包) FragmentTransaction t = getSupportFragmentManager().beginTransaction();

[Android]Volley源码分析(四)

上篇中有提到NetworkDispatcher是通过mNetwork(Network类型)来进行网络访问的,现在来看一下关于Network是如何进行网络访问的. Network部分的类图: Network有一个实现类BasicNetwork,它有一个mHttpStack的属性,实际的网络请求是由这个mHttpStack来进行的,看BasicNetwork的performRequest()方法, 1 @Override 2 public NetworkResponse performRequest