Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> 使用 Camera2 API 實現 Android 手電筒應用

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

編輯:Android資訊

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

在本文中,我們將介紹如何創建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)。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved