Главная » Создаем приложение Фонарик на 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. Оригинал урока. | |
|
Всего комментариев: 1 | |
| |