使用 Camera2 API 實(shí)現(xiàn) Android 手電筒應(yīng)用巷懈!

在本文中,我們將介紹如何創(chuàng)建Android免費(fèi)手電筒應(yīng)用程序慌洪。此教程是“Learn By Doing”教程系列的一部分顶燕,在這里我們將向你展示如何創(chuàng)建簡單的Android app。這將會幫助Android開發(fā)新手增加經(jīng)驗(yàn)冈爹。在學(xué)習(xí)了本教程之后涌攻,你就可以為Android手機(jī)創(chuàng)建最好的手電筒app,并通過Google play散播開來频伤。

要下載完整的源代碼恳谎,請?jiān)L問以下鏈接,并在點(diǎn)擊Download Now按鈕來下載app apk憋肖,請?jiān)L問以下鏈接并點(diǎn)擊Download?APK按鈕:

使用Camera2 API的Android手電筒應(yīng)用程序教程

我們希望你已經(jīng)安裝了Android Studio因痛。如果還沒有陨瘩,那么按照教程安裝Android?Studio梦湘,然后再回到這里袁余。也可以在閱讀本教程之前晌杰,建議你先做一個簡單的Hello Worldapp悼做,并在智能手機(jī)上運(yùn)行谭期。你可以學(xué)習(xí)如何連接呵晚,如何在實(shí)體Android設(shè)備上配置應(yīng)用壶栋,以及如何通過Android Studio運(yùn)行HelloWorld程序。好了赞咙,現(xiàn)在讓我們開始創(chuàng)建我們的LED手電筒應(yīng)用程序吧责循。首先通過如下方式在Android Studio中創(chuàng)建一個新項(xiàng)目。

創(chuàng)建新項(xiàng)目

請按照下列步驟做:

打開Android Studio攀操,通過File => New => New Project創(chuàng)建一個新項(xiàng)目院仿。輸入應(yīng)用程序名稱為LedFlashLight和你公司的域名。(我們使用的是我們公司的域名速和,即 androidtutorialpoint.com歹垫。同樣,你可以使用你公司的颠放。)

點(diǎn)擊Next排惨,選擇Minimum SDK。保持默認(rèn)設(shè)置碰凶,然后單擊Next暮芭。

選擇Empty Activity,然后單擊Next欲低。

在接下來的屏幕中辕宏,輸入Empty Activity為FlashLightActivity,不要忘記查看Generate Layout Button按鈕砾莱,然后單擊Finish瑞筐。

Gradle會同步項(xiàng)目和解決所有的依賴。

添加權(quán)限使用Camera和FlashLight

打開AndroidManifest.xml文件并添加以下權(quán)限:

這些uses-permissions標(biāo)簽告訴Android操作系統(tǒng)恤磷,我們的app需要訪問CAMERA和FLASHLIGHT面哼。同樣uses-feature告訴了在app中將使用什么功能。

LED Flash Light應(yīng)用程序只能在人像模式下工作扫步,因此添加下面的代碼到activity標(biāo)簽。

android:screenOrientation="portrait"

完整的AndroidManifest.xml如下:

AnroidManifest.xml

除了軟件包的名稱匈子,其他一切應(yīng)該都和你的一樣河胎。

生成應(yīng)用程序布局

打開activity_flash_light.xml并添加以下代碼:

我們正在使用ImageButton。當(dāng)用戶按下此按鈕時虎敦,LED手電筒將被切換游岳。

如果你還是Android開發(fā)新手,那么可以通過下面的教程來了解更多關(guān)于Android布局的基礎(chǔ)其徙。

添加功能

打開FlashLightActivity.java并聲明下列變量胚迫。

FlashLightActivity.java

package com.androidtutorialpoint.ledflashlight;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.content.pm.PackageManager;importandroid.hardware.camera2.CameraAccessException;importandroid.hardware.camera2.CameraManager;importandroid.media.MediaPlayer;importandroid.os.Build;importandroid.os.Bundle;importandroid.support.v7.app.AlertDialog;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Log;importandroid.view.View;importandroid.widget.ImageButton;publicclassFlashLightActivityextendsAppCompatActivity{privateCameraManagermCameraManager;privateStringmCameraId;privateImageButtonmTorchOnOffButton;privateBooleanisTorchOn;privateMediaPlayermp;? ? @Overrideprotected void onCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState);Log.d("FlashLightActivity","onCreate()");? ? ? ? setContentView(R.layout.activity_flash_light);? ? ? ? mTorchOnOffButton = (ImageButton) findViewById(R.id.button_on_off);? ? ? ? isTorchOn =false;

在這里,我們只聲明變量唾那,并在onCreate()方法中設(shè)置活動布局访锻。我們還從布局中引用了mTorchOnOffButton Button。后面我們會再具體談一談。這是我們將使用Camera2API期犬,因?yàn)镃amera?API在Android中現(xiàn)在已經(jīng)過時了河哑。

我們需要檢測設(shè)備是否具有手電筒。萬一設(shè)備不支持手電筒龟虎,那么我們需要用警報消息來提醒用戶璃谨。

添加下面的代碼在上面的FlashActivity活動代碼的下面。

FlashLightActivity

Boolean isFlashAvailable = getApplicationContext().getPackageManager()? ? ? ? ? ? ? ? .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);if(!isFlashAvailable) {? ? ? ? ? ? AlertDialog alert =newAlertDialog.Builder(FlashLightActivity.this)? ? ? ? ? ? ? ? ? ? .create();? ? ? ? ? ? alert.setTitle("Error !!");? ? ? ? ? ? alert.setMessage("Your device doesn't support flash light!");? ? ? ? ? ? alert.setButton(DialogInterface.BUTTON_POSITIVE,"OK",newDialogInterface.OnClickListener() {publicvoidonClick(DialogInterface dialog,intwhich){// closing the applicationfinish();? ? ? ? ? ? ? ? ? ? System.exit(0);? ? ? ? ? ? ? ? }? ? ? ? ? ? });? ? ? ? ? ? alert.show();return;? ? ? ? }

如果你的手機(jī)不支持相機(jī)閃光燈鲤妥,那么你會得到以下錯誤佳吞。

按下OK按鈕,應(yīng)用程序會關(guān)閉棉安。

接下來容达,我們把代碼添加到onCreate()方法以獲得CameraManager對象。然后垂券,我們設(shè)置OnClickListener()來開/關(guān)LED手電筒應(yīng)用的按鈕花盐。

在OnClickListener()中,我們檢查手電筒當(dāng)前是開啟還是關(guān)閉的菇爪,然后我們調(diào)用turnOffFlashLight()來關(guān)閉閃光燈算芯,在手電筒已經(jīng)開啟的情況下,以及調(diào)用turnOnFlashLight()來開啟閃光燈凳宙,在手電筒當(dāng)前是關(guān)閉的情況下熙揍。

mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);try{? ? ? ? ? ? mCameraId = mCameraManager.getCameraIdList()[0];? ? ? ? }catch(CameraAccessException e) {? ? ? ? ? ? e.printStackTrace();? ? ? ? }? ? ? ? mTorchOnOffButton.setOnClickListener(newView.OnClickListener() {@OverridepublicvoidonClick(View v){try{if(isTorchOn) {? ? ? ? ? ? ? ? ? ? ? ? turnOffFlashLight();? ? ? ? ? ? ? ? ? ? ? ? isTorchOn =false;? ? ? ? ? ? ? ? ? ? }else{? ? ? ? ? ? ? ? ? ? ? ? turnOnFlashLight();? ? ? ? ? ? ? ? ? ? ? ? isTorchOn =true;? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? }catch(Exception e) {? ? ? ? ? ? ? ? ? ? e.printStackTrace();? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? });? ? }

接下來,我們要添加turnOffFlashLight()和turnOnFlashLight()方法分別用于關(guān)閉和開啟閃光燈氏涩。我們還要添加一個方法playOnOffSound給一個點(diǎn)擊按鈕的聲音效果届囚。

publicvoidturnOnFlashLight(){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();? ? ? ? }? ? }publicvoidturnOffFlashLight(){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();? ? ? ? }? ? }privatevoidplayOnOffSound(){? ? ? ? mp = MediaPlayer.create(FlashLightActivity.this, R.raw.flash_sound);? ? ? ? mp.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {@OverridepublicvoidonCompletion(MediaPlayer mp){// TODO Auto-generated method stubmp.release();? ? ? ? ? ? }? ? ? ? });? ? ? ? mp.start();? ? }

在turnOffFlashLight()中,我們通過設(shè)置mCameraManager.setTorchMode(mCameraId, false);關(guān)閉LED手電筒是尖。同樣的意系,在turnOnFlashLight()中,我們通過設(shè)置 mCameraManager.setTorchMode(mCameraId, true);打開閃光燈饺汹。在playOnOffSound()中蛔添,我們使用MediaPlayer類的create()方法來發(fā)出點(diǎn)擊的聲音。

最后兜辞,通過添加以下代碼覆蓋Activity Lifecycle方法迎瞧。當(dāng)app被用戶最小化時,我們會關(guān)閉閃光燈逸吵,但只要用戶回到app凶硅,閃光燈又會恢復(fù)。

@OverrideprotectedvoidonStop(){super.onStop();if(isTorchOn){? ? ? ? ? ? turnOffFlashLight();? ? ? ? }? ? }@OverrideprotectedvoidonPause(){super.onPause();if(isTorchOn){? ? ? ? ? ? turnOffFlashLight();? ? ? ? }? ? }@OverrideprotectedvoidonResume(){super.onResume();if(isTorchOn){? ? ? ? ? ? turnOnFlashLight();? ? ? ? }? ? }}

現(xiàn)在扫皱,在實(shí)際設(shè)備上運(yùn)行這個app足绅,打開手電筒捷绑,然后用自己的手電筒應(yīng)用程序在黑暗中找尋東西。你可以通過點(diǎn)擊頂部的Download Now按鈕下載Android手電筒app源代碼编检。你也可以通過點(diǎn)擊上面的Download APK下載上面的手電筒apk胎食。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市允懂,隨后出現(xiàn)的幾起案子厕怜,更是在濱河造成了極大的恐慌,老刑警劉巖蕾总,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粥航,死亡現(xiàn)場離奇詭異,居然都是意外死亡生百,警方通過查閱死者的電腦和手機(jī)递雀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀浆,“玉大人缀程,你說我怎么就攤上這事∈锌。” “怎么了杨凑?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摆昧。 經(jīng)常有香客問我撩满,道長,這世上最難降的妖魔是什么绅你? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任伺帘,我火速辦了婚禮,結(jié)果婚禮上忌锯,老公的妹妹穿的比我還像新娘伪嫁。我一直安慰自己,他們只是感情好汉规,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布礼殊。 她就那樣靜靜地躺著,像睡著了一般针史。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碟狞,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天啄枕,我揣著相機(jī)與錄音,去河邊找鬼族沃。 笑死频祝,一個胖子當(dāng)著我的面吹牛泌参,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播常空,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼沽一,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漓糙?” 一聲冷哼從身側(cè)響起铣缠,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昆禽,沒想到半個月后蝗蛙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醉鳖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年捡硅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗棵。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡壮韭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纹因,到底是詐尸還是另有隱情喷屋,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布辐怕,位于F島的核電站逼蒙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寄疏。R本人自食惡果不足惜是牢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望陕截。 院中可真熱鬧驳棱,春花似錦、人聲如沸农曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乳规。三九已至形葬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暮的,已是汗流浹背笙以。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冻辩,地道東北人猖腕。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓拆祈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親倘感。 傳聞我的和親對象是個殘疾皇子放坏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評論 25 707
  • 這是谷歌官方給我們提供的一個兼容低版本安卓設(shè)備的軟件包,里面包囊了只有在安卓3.0以上可以使用的api老玛。而view...
    Ten_Minutes閱讀 5,733評論 1 19
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,711評論 22 664
  • 《裕語言》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 26,017評論 5 19
  • 親愛的佳寧寶貝: 你去上學(xué)了淤年,又剩下我自己。 獨(dú)處的時候逻炊,我會認(rèn)真的去思考互亮,也總能想明白一些事情。 從昨天開始余素,我...
    圓洲綠閱讀 189評論 0 0