转载自:http://www.androidhive.info/2013/04/android-developing-flashlight-application/
今天,我将演示开发一个简单的Android应用程序。这个应用程序即将打开和关闭与简单的触摸设备手电筒/手电筒。请注意,这个程序是针对移动设备而已,我不知道这个程序的外观在平板设备。
设计应用程序
这个程序包含没有太多复杂的设计。你可以设计使用图形编辑软件Photoshop等应用程序。请找到在本教程的源代码文件夹中的应用程序的PSD。我没有涵盖参与,因为它不是本教程的部分设计应用程序的步骤。
创建新项目
1。通过转到创建Eclipse IDE中的新项目File ⇒ New ⇒ Android Application Project 。我叫我的包作为com.androidhive.flashlight和主要活动为MainActivity.java
2。打开你的AndroidManifest.xml文件,并添加所需的权限。清单文件我也被禁止横向模式使用android:screenOrientation =“portrait”属性。
android.permission.CAMERA -需要访问使用照相设备android.hardware.camera -访问摄像头硬件功能所需
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidhive.flashlight"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.androidhive.flashlight.MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
3。将所有的开关图像文件放在drawable-hdpi,drawable-mdpi,drawable-ldpi文件夹。我叫开关图像文件作为btn_switch_off.png和btn_switch_on.png
4,新建一个名为xml文件radial_background.xml放在res ⇒ drwable-hdpi,并粘贴下面的代码。此文件用于创建应用径向渐变背景。
radial_background.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:type="radial"
android:startColor="#343030"
android:endColor="#151515"
android:gradientRadius="300"
android:angle="270"
android:centerY="0.3"/>
</shape>
5。现在打开activity_main.xml中的文件res ⇒ layout文件夹,然后键入以下代码。这种布局文件作为应用程序的主屏幕。
在下面的代码首先我们使用应用了渐变背景radial_background.xml我们前面创建的文件。之后,我们把图像按钮与开关图像。
activity_main.xml
<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/radial_background"
tools:context=".MainActivity" >
<ImageButton
android:id="@+id/btnSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="100dip"
android:src="@drawable/btn_switch_on"
android:background="@null"
android:contentDescription="@null"
/>
</RelativeLayout>
6
,打开你的
MainActivity.java
文件,然后执行以下更改。在这里,我们只需要声明的变量。
MainActivity.java
package com.androidhive.flashlight;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
public class MainActivity extends Activity {
ImageButton btnSwitch;
private Camera camera;
private boolean isFlashOn;
private boolean hasFlash;
Parameters params;
MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// flash switch button
btnSwitch = (ImageButton) findViewById(R.id.btnSwitch);
}
检测设备是否支持手电筒与否
最重要的一步是通知用户,如果设备没有通过显示一个警告信息或其他一些手段,我们就简单地关闭应用程序支持手电筒。
7,打开MainActivity.java并添加以下代码。在下面的代码我们正在检查手电筒的可用性,如果设备不支持的话,我们会显示警告对话框,并通过调用关闭应用程序finish() 。
MainActivity.java
/*
* First check if device is supporting flashlight or not
*/
hasFlash = getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if (!hasFlash) {
// device doesn't support flash
// Show alert message and close the application
AlertDialog alert = new AlertDialog.Builder(MainActivity.this)
.create();
alert.setTitle("Error");
alert.setMessage("Sorry, your device doesn't support flash light!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// closing the application
finish();
}
});
alert.show();
return;
}
打开手电筒
8,在手电筒车削可以通过设置相机闪光灯模式下完成FLASH_MODE_TORCH。以下两个函数getCamera的()和turnOnFlash()会替我们。添加这些功能您MainActivity.java文件
MainActivity.java
// getting camera parameters
private void getCamera() {
if (camera == null) {
try {
camera = Camera.open();
params = camera.getParameters();
} catch (RuntimeException e) {
Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
}
}
}
/*
* Turning On flash
*/
private void turnOnFlash() {
if (!isFlashOn) {
if (camera == null || params == null) {
return;
}
// play sound
playSound();
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isFlashOn = true;
// changing button/switch image
toggleButtonImage();
}
}
关闭手电筒
9。手电筒可以通过设置闪光模式被关闭FLASH_MODE_OFF。
MainActivity.java
/*
* Turning Off flash
*/
private void turnOffFlash() {
if (isFlashOn) {
if (camera == null || params == null) {
return;
}
// play sound
playSound();
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
// changing button/switch image
toggleButtonImage();
}
}
最后调用按钮单击事件这些功能
MainActivity.java
/*
* Switch click event to toggle flash on/off
*/
btnSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFlashOn) {
// turn off flash
turnOffFlash();
} else {
// turn on flash
turnOnFlash();
}
}
});
开/关上手电筒拨动开关图片
10,当用户触摸我们需要切换开关图像打开和关闭状态,只是表示手电筒状态开关。toggleButtonImage()被称为turnOnFlash()和turnOffFlash()函数。
MainActivity.java
/*
* Toggle switch button images
* changing image states to on / off
* */
private void toggleButtonImage(){
if(isFlashOn){
btnSwitch.setImageResource(R.drawable.btn_switch_on);
}else{
btnSwitch.setImageResource(R.drawable.btn_switch_off);
}
}
播放声音开关
如果您正在使用的所有前面的步骤完成后,你的应用程序将正常工作。在这里,我们可以通过玩开关声音时用户触摸开关添加的增强,我们的应用程序。我下载了免费的音色库两个声音文件开关/关状态和命名他们为light_switch_on.mp3和light_switch_off.mp311,在res文件夹中创建一个名为新文件夹raw 并在其中放置这些声音文件。(res ⇒ raw ⇒light_switch_on.mp3,light_switch_off.mp3)
12,下面的函数添加playSound()到您的MainActivity.java文件。
该函数被调用的turnOnFlash()和turnOffFlash()函数。
MainActivity.java
/*
* Playing sound
* will play button toggle sound on flash on / off
* */
private void playSound(){
if(isFlashOn){
mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_off);
}else{
mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_on);
}
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
mp.start();
}
13,重要的不忘记松开相机,一旦我们的应用程序进入背景状态,其他应用程序可能需要访问摄像头。添加如下代码到你的MainActivity.java文件。
在的onPause()方法中,我们关闭了手电筒的应用程序在后台状态进入
在onResume() ,我们的手电筒归向方法
中的onStop()方法中,我们通过调用发布的相机camera.release()方法。
MainActivity.java
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
// on pause turn off the flash
turnOffFlash();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
// on resume turn on the flash
if(hasFlash)
turnOnFlash();
}
@Override
protected void onStart() {
super.onStart();
// on starting the app get the camera params
getCamera();
}
@Override
protected void onStop() {
super.onStop();
// on stop release the camera
if (camera != null) {
camera.release();
camera = null;
}
}
设置应用程序图标
在drawable-hdpi(72 x 72到像素),drawable-mdpi(48×48像素),drawable-ldpi(36×36像素)文件夹,最后设计出的应用程序图标,并放置图像。
最终代码
最终代码MainActivity.java如下
MainActivity.java
package com.androidhive.flashlight;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
public class MainActivity extends Activity {
ImageButton btnSwitch;
private Camera camera;
private boolean isFlashOn;
private boolean hasFlash;
Parameters params;
MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// flash switch button
btnSwitch = (ImageButton) findViewById(R.id.btnSwitch);
// First check if device is supporting flashlight or not
hasFlash = getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if (!hasFlash) {
// device doesn't support flash
// Show alert message and close the application
AlertDialog alert = new AlertDialog.Builder(MainActivity.this)
.create();
alert.setTitle("Error");
alert.setMessage("Sorry, your device doesn't support flash light!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// closing the application
finish();
}
});
alert.show();
return;
}
// get the camera
getCamera();
// displaying button image
toggleButtonImage();
// Switch button click event to toggle flash on/off
btnSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFlashOn) {
// turn off flash
turnOffFlash();
} else {
// turn on flash
turnOnFlash();
}
}
});
}
// Get the camera
private void getCamera() {
if (camera == null) {
try {
camera = Camera.open();
params = camera.getParameters();
} catch (RuntimeException e) {
Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
}
}
}
// Turning On flash
private void turnOnFlash() {
if (!isFlashOn) {
if (camera == null || params == null) {
return;
}
// play sound
playSound();
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isFlashOn = true;
// changing button/switch image
toggleButtonImage();
}
}
// Turning Off flash
private void turnOffFlash() {
if (isFlashOn) {
if (camera == null || params == null) {
return;
}
// play sound
playSound();
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
// changing button/switch image
toggleButtonImage();
}
}
// Playing sound
// will play button toggle sound on flash on / off
private void playSound(){
if(isFlashOn){
mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_off);
}else{
mp = MediaPlayer.create(MainActivity.this, R.raw.light_switch_on);
}
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.release();
}
});
mp.start();
}
/*
* Toggle switch button images
* changing image states to on / off
* */
private void toggleButtonImage(){
if(isFlashOn){
btnSwitch.setImageResource(R.drawable.btn_switch_on);
}else{
btnSwitch.setImageResource(R.drawable.btn_switch_off);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
// on pause turn off the flash
turnOffFlash();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
// on resume turn on the flash
if(hasFlash)
turnOnFlash();
}
@Override
protected void onStart() {
super.onStart();
// on starting the app get the camera params
getCamera();
}
@Override
protected void onStop() {
super.onStop();
// on stop release the camera
if (camera != null) {
camera.release();
camera = null;
}
}
}
源代码下载地址:http://download.csdn.net/detail/hyrzzh/9447092