Это новая рубрика — как сделать приложение, где мы с вами будем учиться делать простые приложения для android, опираясь на материал бесплатных уроков нашего канала. Начнем с простого приложения — это фонарик. Приложение состоит из одной кнопки на экране, которая включает и выключает вспышку камеры устройства — если она есть, конечно.

Для начала создадим проект из шаблона Empty Activity.
В манифесте добавим такие разрешения:

Также в активити добавим директиву, которая отключит его пересоздание при повороте экрана:

Нам понадобятся такие строки, добавьте в res/values/strings.xml:

Здесь имя приложения и тексты для окна сообщения об ошибке.
В папке drawable создадим файл фона для активити:

В папку res/raw (создайте, если ее нет) загрузите звук щелчка по ссылке.

В макете экрана приложения такие компоненты:

Здесь используем экранный компонент Switch — переключатель, выравниваем его по центру.

Теперь код главного класса MainActivity.java:

Пройдемся по коду. Объявляем необходимые переменные. Для проигрывания звука щелчка кнопки используем класс  SoundPool — он подходит для случая, когда вам необходимо многократное воспроизведение небольших файлов. Далее объявляем переменную класса Camera, который нам нужен для работы со вспышкой. Камера нужна из пакета android.hardware. Android Studio помечает класс  Camera и класс Parameters как deprecated — это связано с тем, что в API 21 добавлены новые классы для работы с камерой — пакет Camera2. Но  он поддерживается только устройствами с android 5 и выше. А класс Camera поддерживается и старыми, и новыми устройствами, поэтому будем использовать его.
Также нам нужен экранный компонент Switch и логическая переменная для хранения состояния вспышки. В методе onCreate находим переключатель по ID, устанавливаем его в положение «вкл». Также  присваиваем ему слушатель. Здесь позже пропишем вызов методов включения и выключения вспышки.
Поскольку не во всех устройствах есть вспышка, нужно при старте приложения проверять ее наличие и оповещать пользователя при невозможности использования фонарика. Для оповещения служит метод:

Здесь создается диалоговое окно с заголовком, текстом и кнопкой выхода.
А в onCreate проверяем наличие вспышки:

Получаем контекст приложения, PackageManager и выполняем метод hasSystemFeatureс с параметром FEATURE_CAMERA_FLASH. Добавляем условие — если вспышки нет, вызываем метод showCameraAlert(), а если вспышка есть — получаем экземпляр класса Camera.

Звук воспроизводит класс SoundPool.  В последнее время рекомендуется создание и настройка экземпляра Soundpool с помощью класса SoundPool.Builder.  Soundpool Builder доступен только на API 21+, так что нам нужно будет создать свой Soundpool по разному в зависимости от версии SDK устройства. Для Android 5 и выше будет выполняться этот метод:

Создаем Soundpool Builder с необходимыми атрибутами.
Для устройств, работающих под управлением 4.4 и старше используем конструктор Soundpool:
На вход объекту SoundPool передаем:
— максимальное кол-во одновременно воспроизводимых файлов
— аудио-поток, который будет использоваться
— некий параметр качества, который игнорируется системой. Рекомендуется передавать туда 0
Поскольку класс deprecated, можно использовать подавление предупреждения об этом.
Теперь в onCгeate вызываем один из этих методов через проверку версии устройства:
Методом setOnLoadCompleteListener мы устанавливаем слушателя загрузки. Загрузка аудио-файлов происходит асинхронно, и по ее окончании срабатывает метод onLoadComplete этого слушателя. Далее загружаем файлы методом load. Чтобы загрузить файл из raw, необходимо указать Context, ID raw-файла и приоритет. Приоритет также игнорируется системой, рекомендуется передавать туда 1.
Осталось написать методы включения и выключения фонарика.
Метод setFlashlightOn():
Проигрываем звук методом play, которому передаем файл с такими параметрами
— громкость левого канала (от 0.0 до 1.0)
— громкость правого канала
— приоритет
— количество повторов
— скорость воспроизведения (0.5 — 2)
Дальнейшие действия будем выполнять в отдельном потоке, чтобы не перегружать основной поток интерфейса приложения. Проверяем, что объект камеры создан и получаем ее параметры. Если параметры получены, получаем список поддерживаемых камерой режимов и сохраняем его в массив. Он нам нужен для проверки, какой параметр нужно использовать для включения вспышки камеры. Дело в том, что таких параметров два у разных производителей телефонов: FLASH_MODE_TORCH или FLASH_MODE_ON. Проверяем, какой из этих параметров присутствует в массиве и присваиваем его переменной params. Далее проверяем, что camera не null, устанавливаем параметры и  вызываем метод startPreview(). Этот метод стартует режим превью камеры, нам он нужен для включения вспышки.
В принципе, этого кода достаточно для включения вспышки на многих телефонах, кроме Nexus 5. Для него нужно вызвать также метод  setPreviewTexture с конструктором класса SurfaceTexture в качестве параметра. Этот класс используется для захвата кадров из потока изображения как OpenGL ES текстуры. Поскольку мы это не используем, вместо текстуры передаем 0. Вызов последнего метода выполняем в блоке try/catch с отловом исключения IOException. Методом start запускаем поток.
Теперь метод выключения вспышки. Здесь все проще:
Также проигрываем звук, создаем новый поток. Проверяем, что camera не null, передаем в параметр режим FLASH_MODE_OFF и  устанавливаем параметр, и методом stopPreview останавливаем работу камеры.
Теперь добавим вызов методов включения и выключения вспышки в метод onCreate, в слушатель переключателя:
После окончания работы с камерой ее нужно освобождать для других приложений, пишем метод:
  Вызывать его будем в случаях, когда активити главного экрана приложения становится невидимым, например, когда пользователь сворачивает это приложение или запускает другое. При этом выполняется метод жизненного цикла onStop, переопределим его здесь:
Также пользователь может перейти к другому экрану, при этом вызывается метод onPause. Его мы тоже переопределим и будем освобождать камеру здесь:
Также будем переводить переключатель в положение «выкл».
При возвращении к приложению вызывается метод жизненного цикла onResume, здесь будем через проверку выполнять инициализацию камеры, а также включать вспышку и переключатель:
Наш фонарик готов к работе. Если запустить его в эмуляторе, который не имеет вспышки, мы увидим окно предупреждения с кнопкой выхода.  При запуске на реальном устройстве фонарик отлично работает.
На этом наш урок закончен. Вопросы задавайте в комментариях.
Как создать приложение Фонарик для Android обновлено: Июль 11, 2016 автором: admin

  1. Привет всем я начинаюший прогромист.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*
*
Website