使用 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 Worldapp,并在智能手机上运行。你可以学习如何连接,如何在实体Android设备上配置应用,以及如何通过Android Studio运行HelloWorld程序。好了,现在让我们开始创建我们的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-permissions标签告诉Android操作系统,我们的app需要访问CAMERA和FLASHLIGHT。同样uses-feature告诉了在app中将使用什么功能。

LED Flash Light应用程序只能在人像模式下工作,因此添加下面的代码到activity标签。

android:screenOrientation="portrait"

完整的AndroidManifest.xml如下:

AnroidManifest.xml

除了软件包的名称,其他一切应该都和你的一样。

生成应用程序布局

打开activity_flash_light.xml并添加以下代码:

我们正在使用ImageButton。当用户按下此按钮时,LED手电筒将被切换。

如果你还是Android开发新手,那么可以通过下面的教程来了解更多关于Android布局的基础。

添加功能

打开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()方法中设置活动布局。我们还从布局中引用了mTorchOnOffButton Button。后面我们会再具体谈一谈。这是我们将使用Camera2API,因为Camera API在Android中现在已经过时了。

我们需要检测设备是否具有手电筒。万一设备不支持手电筒,那么我们需要用警报消息来提醒用户。

添加下面的代码在上面的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;        }

如果你的手机不支持相机闪光灯,那么你会得到以下错误。

按下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(newView.OnClickListener() {@OverridepublicvoidonClick(View v){try{if(isTorchOn) {                        turnOffFlashLight();                        isTorchOn =false;                    }else{                        turnOnFlashLight();                        isTorchOn =true;                    }                }catch(Exception e) {                    e.printStackTrace();                }            }        });    }

接下来,我们要添加turnOffFlashLight()和turnOnFlashLight()方法分别用于关闭和开启闪光灯。我们还要添加一个方法playOnOffSound给一个点击按钮的声音效果。

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()中,我们通过设置mCameraManager.setTorchMode(mCameraId, false);关闭LED手电筒。同样的,在turnOnFlashLight()中,我们通过设置 mCameraManager.setTorchMode(mCameraId, true);打开闪光灯。在playOnOffSound()中,我们使用MediaPlayer类的create()方法来发出点击的声音。

最后,通过添加以下代码覆盖Activity Lifecycle方法。当app被用户最小化时,我们会关闭闪光灯,但只要用户回到app,闪光灯又会恢复。

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

现在,在实际设备上运行这个app,打开手电筒,然后用自己的手电筒应用程序在黑暗中找寻东西。你可以通过点击顶部的Download Now按钮下载Android手电筒app源代码。你也可以通过点击上面的Download APK下载上面的手电筒apk。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容