使用 Camera2 API 實現 Android 手電筒應用

2016-10-12    分類:Android開發、程式設計開發、首頁精華1人評論發表於2016-10-12

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

在本文中,我們將介紹如何建立Android免費手電筒應用程式。此教程是“Learn By Doing”教程系列的一部分,在這裡我們將向你展示如何建立簡單的Android app。這將會幫助Android開發新手增加經驗。在學習了本教程之後,你就可以為Android手機建立最好的手電筒app,並通過Google play散播開來。

要下載完整的原始碼,請訪問以下連結,並在點選Download Now按鈕來下載app apk,請訪問以下連結並點選Download APK按鈕:

使用Camera2 API的Android手電筒應用程式教程

我們希望你已經安裝了Android Studio。如果還沒有,那麼按照教程安裝Android Studio,然後再回到這裡。也可以在閱讀本教程之前,建議你先做一個簡單的Hello World app,並在智慧手機上執行。你可以學習如何連線,如何在實體Android裝置上配置應用,以及如何通過Android Studio執行Hello World程式。好了,現在讓我們開始建立我們的LED手電筒應用程式吧。首先通過如下方式在Android Studio中建立一個新專案。

建立新專案

請按照下列步驟做:

  1. 開啟Android Studio,通過File => New => New Project建立一個新專案。輸入應用程式名稱為LedFlashLight和你公司的域名。(我們使用的是我們公司的域名,即androidtutorialpoint.com。同樣,你可以使用你公司的。)
  2. 點選Next,選擇Minimum SDK。保持預設設定,然後單擊Next。
  3. 選擇Empty Activity,然後單擊Next。
  4. 在接下來的螢幕中,輸入Empty Activity為FlashLightActivity,不要忘記檢視Generate Layout Button按鈕,然後單擊Finish。

Gradle會同步專案和解決所有的依賴。

新增許可權使用Camera和FlashLight

開啟AndroidManifest.xml檔案並新增以下許可權:

<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.flash" />

這些uses-permissions標籤告訴Android作業系統,我們的app需要訪問CAMERA 和FLASHLIGHT。同樣uses-feature告訴了在app中將使用什麼功能。

LED Flash Light應用程式只能在人像模式下工作,因此新增下面的程式碼到activity 標籤。

android:screenOrientation="portrait"

完整的AndroidManifest.xml如下:

AnroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.androidtutorialpoint.ledflashlight" >
    <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.flash" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity android:name=".FlashLightActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

除了軟體包的名稱,其他一切應該都和你的一樣。

生成應用程式佈局

開啟activity_flash_light.xml並新增以下程式碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context="com.camera2.MainActivity"
    android:background="#000"
    android:gravity="center">

    <ImageButton
        android:layout_gravity="center"
        android:id="@+id/button_on_off"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#000"
        android:src="@drawable/off"/>

</LinearLayout>

我們正在使用ImageButton。當使用者按下此按鈕時,LED手電筒將被切換。

如果你還是Android開發新手,那麼可以通過下面的教程來了解更多關於Android佈局的基礎。

新增功能

開啟FlashLightActivity.java並宣告下列變數。

FlashLightActivity.java

package com.androidtutorialpoint.ledflashlight;

import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraManager;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;

public class FlashLightActivity extends AppCompatActivity {

    private CameraManager mCameraManager;
    private String mCameraId;
    private ImageButton mTorchOnOffButton;
    private Boolean isTorchOn;
    private MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("FlashLightActivity", "onCreate()");
        setContentView(R.layout.activity_flash_light);
        mTorchOnOffButton = (ImageButton) findViewById(R.id.button_on_off);
        isTorchOn = false;

在這裡,我們只宣告變數,並在onCreate()方法中設定活動佈局。我們還從佈局中引用了mTorchOnOffButton Button。後面我們會再具體談一談。這是我們將使用Camera2API,因為Camera API在Android中現在已經過時了。

我們需要檢測裝置是否具有手電筒。萬一裝置不支援手電筒,那麼我們需要用警報訊息來提醒使用者。

新增下面的程式碼在上面的FlashActivity 活動程式碼的下面。

FlashLightActivity

Boolean isFlashAvailable = getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

        if (!isFlashAvailable) {

            AlertDialog alert = new AlertDialog.Builder(FlashLightActivity.this)
                    .create();
            alert.setTitle("Error !!");
            alert.setMessage("Your device doesn't support flash light!");
            alert.setButton(DialogInterface.BUTTON_POSITIVE, "OK", 
                            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // closing the application
                    finish();
                    System.exit(0);
                }
            });
            alert.show();
            return;
        }

如果你的手機不支援相機閃光燈,那麼你會得到以下錯誤。

按下OK按鈕,應用程式會關閉。

接下來,我們把程式碼新增到onCreate()方法以獲得CameraManager物件。然後,我們設定OnClickListener()來開/關LED手電筒應用的按鈕。

在OnClickListener()中,我們檢查手電筒當前是開啟還是關閉的,然後我們呼叫turnOffFlashLight()來關閉閃光燈,在手電筒已經開啟的情況下,以及呼叫turnOnFlashLight()來開啟閃光燈,在手電筒當前是關閉的情況下。

mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {
            mCameraId = mCameraManager.getCameraIdList()[0];
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }

        mTorchOnOffButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if (isTorchOn) {
                        turnOffFlashLight();
                        isTorchOn = false;
                    } else {
                        turnOnFlashLight();
                        isTorchOn = true;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

接下來,我們要新增turnOffFlashLight()和turnOnFlashLight()方法分別用於關閉和開啟閃光燈。我們還要新增一個方法playOnOffSound給一個點選按鈕的聲音效果。

public void turnOnFlashLight() {

        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mCameraManager.setTorchMode(mCameraId, true);
                playOnOffSound();
                mTorchOnOffButton.setImageResource(R.drawable.on);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void turnOffFlashLight() {

        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mCameraManager.setTorchMode(mCameraId, false);
                playOnOffSound();
                mTorchOnOffButton.setImageResource(R.drawable.off);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void playOnOffSound(){

        mp = MediaPlayer.create(FlashLightActivity.this, R.raw.flash_sound);
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mp.release();
            }
        });
        mp.start();
    }

在turnOffFlashLight()中,我們通過設定mCameraManager.setTorchMode(mCameraId, false);關閉LED手電筒。同樣的,在turnOnFlashLight()中,我們通過設定mCameraManager.setTorchMode(mCameraId, true);開啟閃光燈。在playOnOffSound()中,我們使用MediaPlayer類的create()方法來發出點選的聲音。

最後,通過新增以下程式碼覆蓋Activity Lifecycle方法。當app被使用者最小化時,我們會關閉閃光燈,但只要使用者回到app,閃光燈又會恢復。

@Override
    protected void onStop() {
        super.onStop();
        if(isTorchOn){
            turnOffFlashLight();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(isTorchOn){
            turnOffFlashLight();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(isTorchOn){
            turnOnFlashLight();
        }
    }
}

現在,在實際裝置上執行這個app,開啟手電筒,然後用自己的手電筒應用程式在黑暗中找尋東西。你可以通過點選頂部的Download Now按鈕下載Android手電筒app原始碼。你也可以通過點選上面的Download APK下載上面的手電筒apk。

下一步??

我們將在Learn By Doing中涵蓋更多的教程!如果大家有任何疑問或建議的話,請在下面留下評論。

要下載完整的原始碼,可以訪問以下連結,並點選Download Now按鈕,要下載app apk,請訪問連結並點選Download APK 按鈕:

使用Camera2 API的Android手電筒應用程式教程

許可證

這篇文章,以及相關的原始碼和檔案許可釋出遵循Code Project Open License (CPOL)。

譯文連結:http://www.codeceo.com/article/android-camera2-api-flashlight.html
英文原文:Android Flash Light Application Tutorial Using Camera2 API
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章