четверг, 28 марта 2013 г.

Проигрывание аудио на устройстве Android

Работа с аудио в приложениях для Android не представляет особых трудностей. Можно воспроизводить аудио треки, хранящиеся в памяти устройства или с удаленного сервера, правда в последнем случае возможны проблемы с производительностью приложения при низкой скорости сетевого подключения (например, GSM), связанные с необходимостью загрузки трека на устройство при его воспроизведении.
Для реализации проигрывания аудио в приложении необходимо использовать пакет android.media. Главный класс, необходимый для работы с воспроизведением аудио - MediaPlayer. Данный класс предоставляет набор методов по управлению воспроизведением аудио:
  • start() - запуск воспроизведения аудио,
  • pause() - приостанавливает воспроизведение аудио,
  • stop() - завершает воспроизведение.
Для того, чтобы воспроизвести аудио трек из файла-ресурса в приложении нужно написать простой код:

MediaPlayer mediaPlayer;
mediaPlayer = MediaPlayer.create(this, R.raw.mediatest);
mediaPlayer.start();

В случае, если вы хотите проиграть трек с удаленного ресурса нужно немного изменить код:

MediaPlayer mediaPlayer = new MediaPlayer();

try {
   mediaPlayer.setDataSource(trackUrl);


   mediaPlayer.setOnPreparedListener(new OnPreparedListener(){
       @Override
       public void onPrepared(MediaPlayer arg0) {
          arg0.start(); //Запускаем на воспроизведение
       }    
   });

   mediaPlayer.prepare();
   


Здесь мы с помощью метода setDataSource задаем источник аудио, затем устанавливаем обработчик на событие prepared для определения момента, когда медиаплеер будет готов к воспроизведению и с помощью метода prepare блокируем медиаплеер от воспроизведения до тех пор, пока он не будет готов.
Проверить состояния воспроизведения медиаплеера можно с помощью метода isPlaying().
Получить текущую позицию воспроизведения трека можно с помощью метода getCurrentPosition(), метод возвращает позицию в милиисекундах.
Если вы реализуете потоковое проигрывание аудиофайлов, то вам стоит использовать обработчик для события oncompletion для выполнения переключения на следующий трек после завершения воспроизведения текущего трека:

mediaPlayer.setOnCompletionListener(new OnCompletionListener(){
       @Override
       public void onCompletion(MediaPlayer mp) {
          //Запускаем на воспроизведение следующий трек
       }    
   });



Также важно учесть, что при переключении на другой трек нужно сбрасывать состояние медиаплеера на изначальное с помощью метода reset().
При выходе с экрана проигрывания аудио рекомендуется завершать работу с медиаплеером с помощью метода release():

public void onDestroy(){
   super.onDestroy();
   this.mediaPlayer.release();
}


Удачного программирования с использованием аудио в Android.

вторник, 5 марта 2013 г.

Чтение файлов на устройстве Android

Часто при разработке приложений под Android возникают задачи, требующие доступ к файловой системе мобильного устройства, например, если нужно сохранять данные локально в файл на устройстве пользователя. В таком случае необходимо воспользоваться API к файловой системе Android. API предоставляет возможности манипуляции файлами и директориями в файловой системе.
В системе Android существует два способа хранения данных в памяти: во внутренней памяти устройства и на внешнем носителе (SD-карте). Для записи данных во внешнюю память нужно  в файл манифеста приложения AndroidManifest.xml добавить соответствующее разрешение:

<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></permission>

Я покажу как можно получить список файлов в определенной директории.
Для доступа к файлам и папкам в Android используется класс File из java.io. Конструктор класса File по умолчанию принимает путь до файла или папки:

File imagesPath = new File("/mnt/sdcard/Android/data/images");

Можно указать полный путь к файлу или папке. Также можно получить доступ к корневой директории SD-карты с помощью Environment.getExternalStorageDirectory():

File imagesPath = new File(Environment.getExternalStorageDirectory() + "images"); 

Перед тем, как начать работать с папкой, нужно проверить ее существование:

if(imagesPath.exists()){
   // Выполнение операций над папкой
}


Для того, чтобы получить список файлов в определенной папке в классе File реализован метод listFiles():

File[] images = imagesPath.listFiles();

Другие возможности класса File можно посмотреть в документации языка Java.
Приятного программирования с использованием API файловой системы Android!

суббота, 23 февраля 2013 г.

Проверка подключения устройства к сети

Довольно часто мобильные приложения используются для передачи данных по сети, например, для загрузки ленты новостей из внешних интернет-ресурсов, загрузки данных с собственного сервера, отправки сообщений из приложения в аккаунт пользователя в социальных сетях и т. д. Для таких приложений необходимо активное подключение к одному из доступных видов сети: GSM, GPRS, 3G, WiFi и другие.
Для корректной работы приложения нужно проверять текущее состояние подключения к сети, а затем при условии доступности сети выполнять дальнейшие операции.
Для получения состояния подключения к сети нужно добавить соответствующие разрешения в файл манифеста  AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

 Для проверки состояния сети предназначены классы ConnectivityManager и NetworkInfo. Следующий код определяет существует ли подключение к беспроводной сети:

 ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        // Выполнить дальнейшие операции
    } else {
        // Показать сообщение об ошибке
    }



В классе NetworkInfo реализованы методы для определения типа сети, к которой в данный момент подключено мобильное устройство:
getType() - возвращает одно из значений перечисления: TYPE_MOBILE, TYPE_WIFI, TYPE_WIMAX, TYPE_ETHERNET, TYPE_BLUETOOTH,
getTypeName() - возвращает имя типа сети в читаемом для человека виде, например "WIFI".
Этой информации должно быть достаточно для выполнения различных действий при подключении к различным беспроводным сетям.
Удачного программирования!

понедельник, 18 февраля 2013 г.

Управление эмулятором Android через telnet

Не каждый разработчик приложений под Android имеет собственное реальное устройство, на котором можно тестировать приложения. Часто для тестирования приложений используется встроенный в Android SDK эмулятор. Иногда при разработке приложения необходимо проверить его работу при определенных условиях, например, при низком заряде батареи, при входящем вызове и т.д., а также протестировать геолокацию, доступ к которой на эмуляторе затруднен.
Для таких случаев можно управлять запущенным эмулятором посредством telnet. Для этого необходимо выполнить несколько простых действий:
  1. Включите telnet в случае если он отключен в списке компонент Windows: открыть Панель инструментов, открыть раздел Программы и нажать ссылку Включение и отключение компонентов Windows, где поставить галочку возле 
  2. Откройте командную строку и введите команду:
  3. > telnet localhost 5554
Заметьте, что 5554 - стандартный порт для эмулятора, его значение будет другим для других запущенных эмуляторов.
Telnet поддерживает набор команд, позволяющих управлять эмулятором:
help - выводит список команд
event - симулирует аппаратные события
geo - команды, связанные с геолокацией
gsm - команды, связанные с сетью GSM
kill - уничтожает экземпляр эмулятора
network - управляет настройками сети
power - управляет энергопотреблением
quit|exit - выходит из сессии
sms - команды, связанные с SMS

Например, для того, чтобы установить уровень заряда батареи нужно выполнить команду:
power capacity <percent>

Уровень заряда батареи установится на уровне значения percent в процентах.
Для эмуляции входящего звонка нужно выполнить команду:
gsm call <phone_number>

Для установки текущих координат абонента нужно выполнить команду:
geo fix <lat> <lng>


Приятного программирования с использованием telnet!

четверг, 14 февраля 2013 г.

Отключение управления энергопотреблением в Android приложении

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

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

За управление энергопотреблением в Android отвечает класс PowerManager из пакета android.os. Использование этого API существенно влияет на время жизни батареи, поэтому рекомендую использовать класс PowerManager.WakeLock() только при крайней необходимости и по возможности применять минимальные уровни, а также освобождать его когда вы в нем больше не нуждаетесь.
Получить экземпляр класса PowerManager можно с помощью вызова метода Context.getSystemService().
Самый важный метод класса PowerManager, который вам понадобится, это newWakeLock(). Он создает объект WakeLock, который предоставляет методы управления состоянием энергопотребления. На практике все очень просто:

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
        final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "MyTag");

wl.acquire();
wl.release();


В метод newWakeLock() первым параметром передаем уровень блокировки. Существует несколько предопределенных уровней блокировки, имеющих различное влияние на энергопотребление:
PARTIAL_WAKE_LOCK - экран может затемниться и перейти в спящий режим, клавиатура может скрыться,
SCREEN_DIM_WAKE_LOCK - экран может только затемниться, клавиатура может скрыться,
SCREEN_BRIGHT_WAKE_LOCK - экран остается ярким, а клавиатура может скрыться,
FULL_WAKE_LOCK - экран остается ярким, клавиатура остается раскрытой.

Использование WakeLock для блокировки погасания экрана отключает затемнение экрана во всем устройстве. Поэтому рекомендуется вместо WakeLock использовать FLAG_KEEP_SCREEN_ON:

getActivity().getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Для отключения блокировки нужно добавить строку:

getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Удачной разработки приложений!