使用 Camera2 API 實現 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中建立一個新專案。
建立新專案
請按照下列步驟做:
- 開啟Android Studio,通過File => New => New Project建立一個新專案。輸入應用程式名稱為LedFlashLight和你公司的域名。(我們使用的是我們公司的域名,即androidtutorialpoint.com。同樣,你可以使用你公司的。)
- 點選Next,選擇Minimum SDK。保持預設設定,然後單擊Next。
- 選擇Empty Activity,然後單擊Next。
- 在接下來的螢幕中,輸入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
翻譯作者:碼農網 – 小峰
[ 轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]
相關文章
- 絕大部分 Android 手電筒應用需要大量許可權Android
- Android camera2實現預覽Android
- Android手電筒+閃光燈基本原始碼Android原始碼
- 建議:Win10手機通知中心應包含手電筒Win10
- 過河 手電筒 面試題面試題
- 手電筒按鈕變成灰色
- 蘋果ios10怎麼調手電筒亮度 ios10手電筒亮度調節方法蘋果iOS
- 國家資訊保安研究:十大惡意應用 手電筒排第一
- 如何使用Android原生介面,實現“應用雙開”Android
- Android音視訊(一) Camera2 API採集資料AndroidAPI
- 使用Scrcpy實現電腦控制安卓手機安卓
- Android應用開發中如何使用隱藏的APIAndroidAPI
- Android實現模組 api 化AndroidAPI
- Android使用Camera2獲取預覽資料Android
- 使用Android API最佳實踐AndroidAPI
- android應用實現重啟系統Android
- Android應用架構之MVP實現Android應用架構MVP
- 如何在Android應用中使用百度地圖apiAndroid地圖API
- Vue3使用Composition API實現響應式VueAPI
- 使用 Flask 實現 RESTful APIFlaskRESTAPI
- Holer實現手機APP應用外網訪問本地WEB應用APPWeb
- Android應用加固的簡單實現方案Android
- 如何實現 Android 應用的持續部署?Android
- Android實現應用的增量更新\升級Android
- 使用Android簡單實現有道電子詞典Android
- 商品API資料在電商中的應用與實現API
- 如何使用電商API介面API介面如何應用API
- 野外露營手電筒+吊燈+打火機 這個Sparkr統統搞定Spark
- .NET雲原生應用實踐(二):Sticker微服務RESTful API的實現微服務RESTAPI
- Android應用加固的簡單實現方案(二)Android
- Android應用內懸浮窗的實現方案Android
- Android應用耗電分析隨筆Android
- 使用阿里 Druid 實現應用級waf阿里UI
- Android不使用第三方升級庫實現應用升級Android
- 使用ANT打包Android應用Android
- 如何使用API介面獲取商品資料,從申請API介面、使用API介面到實際應用,一一講解API
- 應用koa的上傳檔案,手動實現koa
- Android端實現多人音視訊聊天應用(一)Android