Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Smurfix
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 27
#1

Static MediaPlayer - Программирование Android

21.02.2016, 11:33. Просмотров 263. Ответов 8
Метки нет (Все метки)

Добрый день!
Пытался реализовать следующий алгоритм работы своего приложения:
  1. Пользователь кликая по изображению открывает новый интент.
  2. Перед открытием интента создавался MediaPlayer который проигрывал аудиофайл с названием картинки.
  3. Активность просмотра картинки имеет кнопку, по нажатию которой должно повторно проиграть аудиофайл с названием картинки.
Вроде ничего сложного, в обработчик нажатия кнопки запихнул создание медиаплеера и старт интента. Но столкнулся с проблемой - длинные аудиофайлы обрывались не успевая воспроизвестись до конца в момент старта нового интента.
Делать паузы перед стартом новой активности и заставлять пользователя ждать пока проиграется аудифайл не очень хочется. Подумал о возможности использования одного статического MediaPlayer-а в главной активности. Одновременно это решило бы проблему когда аудиофайл еще воспроизводится, а пользователь нажмет на кнопку воспроизведения - звучание разных плееров не наложится друг на друга.
Прописал создание плеера в главной активности:
Java
1
2
3
4
5
6
7
8
9
public static MediaPlayer audioPlayer;
 
 @Override
    protected void onCreate(Bundle savedInstanceState) {
    ....
    audioPlayer = new MediaPlayer();
    audioPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    ....
    }
Прописал работу с плеером в других активностях:
Java
1
2
3
4
AssetFileDescriptor fd = MainActivity.expansionFile.getAssetFileDescriptor("assets/wav/" + getResources().getString(soundId));
MainActivity.audioPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
MainActivity.audioPlayer.prepare();
MainActivity.audioPlayer.start();
Запускается, но работает только один раз. При повторном задании пути к аудиофайлу приложение вылетает.
Подскажите пожалуйста, как решить эту проблему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2016, 11:33     Static MediaPlayer
Посмотрите здесь:

MediaPlayer автореверс - Программирование Android
Всем привет,вопрос такое ,можно как нибудь сделать,чтоб в медиаплеере воспроизводить песню ,не слева на право ,а с право налево?

SoundPool vs MediaPlayer - Программирование Android
Какой класс лучше использовать для проигрывания музыки? Под музыкой подразумеваю не короткий сигнал, а большое количество песен, с большим...

Ошибка MediaPlayer'a - Программирование Android
Здравствуйте форумчане.Создал кнопочку для проигрывания мелодии, но при проигрывании в консоли постоянно вылезает ошибка "E/MediaPlayer:...

MediaPlayer задать громкость - Программирование Android
Как в MediaPlayer задать максимальную громкость? Или системную для уведомлений. AssetFileDescriptor afd =...

Работа с fragments и MediaPlayer - Программирование Android
Здравствуйте! Возник такой вопрос. Я организовал кнопку, при нажатии которой вызывается фрагмент и включается медиафайл. Во фрагменте...

Вылет приложения с MediaPlayer - Программирование Android
Использую один MediaPlayer. Даю ему разный звук при нажатии на каждую из 5 кнопок вот так: @Override public void...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 47
24.02.2016, 21:30     Static MediaPlayer #2
Попробуй так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
AssetFileDescriptor fd = MainActivity.expansionFile.getAssetFileDescriptor("assets/wav/" + getResources().getString(soundId));
   if(fd!=null) {
      try {
         MainActivity.audioPlayer.reset();
         MainActivity.audioPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
         MainActivity.audioPlayer.prepare();
         MainActivity.audioPlayer.start();
         fd.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
Smurfix
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 27
24.02.2016, 22:44  [ТС]     Static MediaPlayer #3
Спасибо Kadagor, reset помог с проблемой вылета
Только создание статического плеера не решило проблему с обрывом воспроизведения

А нет способа проигрывать аудио независимо от работы интентов?
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 47
24.02.2016, 23:06     Static MediaPlayer #4
Smurfix, вероятнее всего ваш "обрыв" происходит не в момент загрузки интента, а в момент сброса плеера. Тогда вам будет нужно отслеживать воспроизводит ли плеер звук, сбрасывать и присваивать новый ресурс уже после окончания воспроизведения.
Чтобы убедится, попробуйте воспроизвести длинный аудиофайл и открывать новую активность где нет обращения к плееру. Напишите какой будет результат
Smurfix
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 27
24.02.2016, 23:12  [ТС]     Static MediaPlayer #5
Вы правы, при переходе на интент без плеера файл не обрывается.
А как отследить воспроизводит ли плеер звук?
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 47
25.02.2016, 00:34     Static MediaPlayer #6
Насколько я понял в медиаплеере уже указан необходимый файл. Есть ли смысл "переуказывать"?
_Night_Scream_
75 / 74 / 8
Регистрация: 08.08.2013
Сообщений: 584
25.02.2016, 09:53     Static MediaPlayer #7
почему бы просто не запускать на новом интенте звук сразу после появления и потом по клику?
Smurfix
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 27
25.02.2016, 21:05  [ТС]     Static MediaPlayer #8
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
почему бы просто не запускать на новом интенте звук сразу после появления и потом по клику?
Идея хорошая, но в моем случае не походит. Первый интент - навигационный, второй отображает картинку. Проблема в том, что переход в меню не всегда открывает картинку, иногда открываются подразделы. Соответственно озвучка должна быть в каждом интенте

Цитата Сообщение от Kadagor Посмотреть сообщение
Насколько я понял в медиаплеере уже указан необходимый файл. Есть ли смысл "переуказывать"?
В принципе да, но так я буду ограничен в способе открытия интента с картинкой, лучше все-таки "переуказывать"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2016, 21:59     Static MediaPlayer
Еще ссылки по теме:

MediaPlayer выбор из Raw ? - Программирование Android
Можно ли в MediaPlayer предоставить пользователю возможность выбрать треки из raw , как это сделать? или сделать возможность копировать...

MediaPlayer.OnCompletionListener ошибка - Программирование Android
Здравствуйте. Вот в таком коде: import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import...

MediaPlayer, проигрывание музыки - Программирование Android
Добрый день! Есть кто знает как добавить музыку, но не на фон когда активити открывается а тогда когда нажимаешь плэй на плайэре

MediaPlayer не хочет умирать - Программирование Android
Дано: Приложение с несколькими активити Задача: Запустить фоновую музычку при запуске приложения, поддерживать её проигрывания во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 47
25.02.2016, 21:59     Static MediaPlayer #9
Для удобства объявим отдельную функцию
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean setAudioFromASSET(String str ){
        boolean f = false;
        AssetFileDescriptor fd = MainActivity.expansionFile.getAssetFileDescriptor("assets/wav/" + str);
        if(fd!=null) {
            try {
                MainActivity.audioPlayer.reset();
                MainActivity.audioPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
                MainActivity.audioPlayer.prepare();
                f = true;
                fd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return f;
    }
Можешь переделать ее по фен-шуй к виду типа:
Java
1
public boolean setAudioFromASSET(String fileName, MediaPlayer mp)
Проверяем воспроизводит ли плеер . Если нет, подгружаем файл. Если да, делаем это чуть позже:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if(MainActivity.audioPlayer.isPlaying()){
    MainActivity.audioPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            if(fPrepareAudio) {
                setAudioFromASSET(audioFileName); 
                fPrepareAudio = false;
            }
        }
    });
}else{
    setAudioFromASSET(audioFileName);
    fPrepareAudio = false;
}
Точно не знаю, сработает ли OnCompletionListener один раз или каждый раз, когда файл проиграло, по этой причине использовал переменную fPrepareAudio. При объявлении присвоил ей true :
Java
1
private boolean fPrepareAudio = true;
Кнопка на воспроизведение. При нажатии на нее сразу подгружаем файл, но только первый раз:
Java
1
2
3
4
5
6
7
8
9
10
public void onClick(View v) {
    switch(v.getId()){
        case R.id.button1:
            if(fPrepareAudio) {
                setAudioFromASSET(audioFileName);
                fPrepareAudio = false;
            }
            MainActivity.audioPlayer.start();
            break;
     }
Yandex
Объявления
25.02.2016, 21:59     Static MediaPlayer
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru