Android手电筒介绍

转载自:http://www.androidhive.info/2013/04/android-developing-flashlight-application/

今天,我将演示开发一个简单的Andr​​oid应用程序。这个应用程序即将打开和关闭与简单的触摸设备手电筒/手电筒。请注意,这个程序是针对移动设备而已,我不知道这个程序的外观在平板设备。

设计应用程序

这个程序包含没有太多复杂的设计。你可以设计使用图形编辑软件Photoshop等应用程序。请找到在本教程的源代码文件夹中的应用程序的PSD。我没有涵盖参与,因为它不是本教程的部分设计应用程序的步骤。

android flashlight app tutorial

创建新项目

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-hdpidrawable-mdpidrawable-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;
}
android flashlight no flash support

打开手电筒

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.mp3light_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

猜你喜欢

转载自blog.csdn.net/hyrzzh/article/details/50761785