Создаем приложение Фонарик на Android
Главная » Создаем приложение Фонарик на Android

Сегодня мы возьмемся за интересный и полезный урок, а именно - научимся создавать приложение "Фонарик" для Android устройств. Приложение будет предельно простым: главное окно программы с кнопкой включить/выключить фонарик. 

По поводу внешнего вида приложения, то используемая графика будет не запредельно сложной, а всего лишь фоновое изображение и пару изображений для кнопки во включенном и выключенном состоянии. Можете подготовить эти изображения сами по собственному желанию, если хотите внести в приложение свою собственную лепту, так сказать. Но если вам не хочется этого делать (мне тоже), то воспользуемся уже готовыми красивыми изображениями. Я их сам резал, поэтому возможно (так и будет) картинка включенной и выключенной кнопки немного не совпадут по своему местоположению из за неодинаковых границ границ изображений. Если вы хотите попытаться сделать лучше, вот вам оригинальное изображение для вырезания:

Изображения для фонарика

В архиве с изображениями, те что помечены цифрой 1 - это hdpi, 2- mdpi, 3 - ldpi.

Теперь можно переходить к созданию нового проекта, выберем Blank Activity. Для того, чтоб наш фонарик заработал, нужно в файле манифеста получить разрешения на использование вспышки камеры. Там нет такого разрешения непосредственно, так как вспышка входит в функционал камеры, поэтому нужно получить разрешение на работу с камерой и ее возможностями. Открываем файл AndroidManifest.xml и добавляем туда парочку разрешений на камеру:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"/>

Теперь нужно добавить изображения кнопок в папку res/drawable, а точнее изображения hdpi, mdpi и ldpi в соответствующие папки drawable-hdpi, drawable-mdpi, drawable-ldpi. Только уберите те циферки в именах изображений (1,2,3) и проследите, чтобы в разных папках изображения включенной и выключенной кнопки имели одинаковые названия. Фон нашего приложения будет белого цвета и, будем надеяться, красиво сольется с изображениями кнопок. 

Открываем файл activity_main.xml и добавим туда кнопочку ImageView, которая и будет в итоге включать и выключать фонарик:

<RelativeLayout 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"
 tools:context=".MainActivity"
 android:background="#FFFFFF">
 <ImageButton
 android:id="@+id/btnSwitch"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerHorizontal="true"
 android:layout_marginTop="100dip"
 android:src="@drawable/turn_on"
 android:background="@null"
 android:contentDescription="@null"/>
</RelativeLayout>

Теперь откроем MainActivity.java и объявим необходимые переменные:

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;

public class MainActivity extends Activity {

 ImageButton btnSwitch;

 private Camera camera;
 private boolean isFlashOn;
 private boolean hasFlash;
 Parameters params;
 MediaPlayer mp;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 //Кнопка включения фонарика
 btnSwitch = (ImageButton) findViewById(R.id.btnSwitch);

 }
}

Программу нужно оборудовать возможностью проверять, поддерживается ли работа фонарика на данном устройстве, присутствует ли там вспышка вообще. Если ее нету, то будет показываться соответствующее сообщение и приложение будет закрываться. Для того, чтобы реализовать это, тут же в MainActivity.java добавим следующий код, который в случае отсутствия на устройстве вспышки будет показывать сообщение в виде Alert Dialog и закрывать приложение:

 /*
 * Проверяем, поддерживает ли устройство вспышку или нет
 */
 hasFlash = getApplicationContext().getPackageManager()
 .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);

 if (!hasFlash) {
 //Устройство не поддерживает функцию вспышки
 //Показываем печальное сообщение и закрываем приложение:
 AlertDialog alert = new AlertDialog.Builder(MainActivity.this)
 .create();
 alert.setTitle("Ошибка");
 alert.setMessage("Ваше устройство не поддерживает работу с вспышкой!");
 alert.setButton("OK", new DialogInterface.OnClickListener() {
 public void onClick(DialogInterface dialog, int which) {
 //Закрываем приложение:
 finish();
 }
 });
 alert.show();
 return;
}

Если сейчас запустить приложение на устройстве без вспышки, то вы увидите Alert Dialog с ошибкой.

Включение фонарика происходит с помощью установки режима работы камеры FLASH_MODE_TORCH. Настройка процесса включения будет происходить с помощью 2-х функций getCamera и turnOnFlash. Добавим их к коду в MainActivity.java:

//Получаем параметры камеры:
 private void getCamera() {
 if (camera == null) {
 try {
 camera = Camera.open();
 params = camera.getParameters();
 } catch (RuntimeException e) {
 Log.e("Ошибка, невозможно запустить: ", e.getMessage());
 }
 }
 }
 
 /*
 * Включаем вспышку
 */
 private void turnOnFlash() {
 if (!isFlashOn) {
 if (camera == null || params == null) {
 return;
 }
 //Проигрываем звук
 playSound();
 
 params = camera.getParameters();
 params.setFlashMode(Parameters.FLASH_MODE_TORCH);
 camera.setParameters(params);
 camera.startPreview();
 isFlashOn = true;
 
 //Меняем изображение кнопки при переключении:
 toggleButtonImage();
 }
}

Для выключения фонарика будет использоваться настройка на режим FLASH_MODE_OFF:

 /*
 * Выключаем фонарик
 */
 private void turnOffFlash() {
 if (isFlashOn) {
 if (camera == null || params == null) {
 return;
 }
 //Проигрываем звук:
 playSound();

 params = camera.getParameters();
 params.setFlashMode(Parameters.FLASH_MODE_OFF);
 camera.setParameters(params);
 camera.stopPreview();
 isFlashOn = false;

 //Меняем картинку кнопки:
 toggleButtonImage();
 }
}

Теперь осталось только добавить обработчик нажатий по кнопке ImageView:

 /*
 * Обработчик события нажатий по кнопке
 */
 btnSwitch.setOnClickListener(new View.OnClickListener() {
 
 @Override
 public void onClick(View v) {
 if (isFlashOn) {
 //Выключаем фонарик:
 turnOffFlash();
 } else {
 //Включаем фонарик:
 turnOnFlash();
 }
 }
 });

Когда пользователь будет включать и выключать фонарик, изображение кнопки должно меняться. Для этого добавим метод переключения изображений при нажатии на кнопку:

/*
 * Переключатель смены изображения
 */
 private void toggleButtonImage(){
 if(isFlashOn){
 btnSwitch.setImageResource(R.drawable.turn_on);
 }else{
 btnSwitch.setImageResource(R.drawable.turn_off);
 }
 }

В принципе, уже сейчас приложение готово к работе, но нам хочется еще сделать так, чтобы при переключении кнопки проигрывался звук включения/выключения фонарика. Для этого звук сначала нужно скачать. Можете взять это, можете найти что то получше и покороче, я не нашел. Для работы со звуком, создайте в проекте новую папке res/raw и закиньте туда звуковой файл. В код файла MainActivity.java добавляем следующий код:

 /*
 * Проигрывание звука
 */
 private void playSound(){
 if(isFlashOn){
 mp = MediaPlayer.create(MainActivity.this, R.raw.sound);
 }else{
 mp = MediaPlayer.create(MainActivity.this, R.raw.sound);
 }
 mp.setOnCompletionListener(new OnCompletionListener() {

 @Override
 public void onCompletion(MediaPlayer mp) {
 mp.release();
 }
 });
 mp.start();
}

Остается только добавить несколько важных методов, которые будут способствовать корректной работе приложения:

onPause() - метод выключает фонарик и вводит приложение в фоновый режим работы;

onResume() - метод включает фонарик обратно;

onStop() - закрываем камеру.

Добавляем следующий код:

@Override
 protected void onDestroy() {
 super.onDestroy();
 }

 @Override
 protected void onPause() {
 super.onPause();

 //Временно выключаем фонарик:
 turnOffFlash();
 }

 @Override
 protected void onRestart() {
 super.onRestart();
 }

 @Override
 protected void onResume() {
 super.onResume();

 //Продолжаем работу фонарика:
 if(hasFlash)
 turnOnFlash();
 }

 @Override
 protected void onStart() {
 super.onStart();

 //Получаем для приложения параметры камеры:
 getCamera();
 }

 @Override
 protected void onStop() {
 super.onStop();

 //Закрываем работу камеры:
 if (camera != null) {
 camera.release();
 camera = null;
 }
 }

Все! Теперь остается только протестировать приложение:

Фонарик включен     Фонарик выключен

Очень неплохо, оказалось, что смещение изображений вкл/выкл оказалось еле заметным, но это на дисплее 4,5 дюйма. 

Ну и перед тестированием не забудьте, что тестировать приложение работы фонарика есть смысл на устройстве, в котором есть фонарик :). Удачи!

Полный код MainActivity.java.

Оригинал урока.

Категория: Уроки программирования | Просмотров: 5194 | Добавил: Oleg | Теги: делаем фонарик, программирование Android, приложение Фонарик | Рейтинг: 3.8/4
Всего комментариев: 1
avatar
1 kudaplay • 00:21, 02.01.2016
Как это побороть?
flashlight E/Ошибка, невозможно запустить:: Fail to connect to camera service
В манифесте добавил всё. добавил верно)
test device - Nexus 5 (есть и фронталка и главная камеры.)
avatar