четверг, 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!