Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Smurfix
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 32
1

Static MediaPlayer

21.02.2016, 11:33. Просмотров 354. Ответов 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();
Запускается, но работает только один раз. При повторном задании пути к аудиофайлу приложение вылетает.
Подскажите пожалуйста, как решить эту проблему?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2016, 11:33
Ответы с готовыми решениями:

"constructor MediaPlayer in class MediaPlayer cannot be applied to given types"
Проблема в строке "37--final MediaPlayer mp = new MediaPlayer(this,R.raw.sample);" Ошыбка :...

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

Регистрация MediaPlayer
Подскажите как зарегистрировать MediaPlayer, чтоб при открытии файла он появлялся в диалоге...

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

Простой MediaPlayer
Нужно сделать простую програмку. В главном активити - Баттн, при нажатии на него появляется...

8
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 51
24.02.2016, 21:30 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();
      }
   }
1
Smurfix
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 32
24.02.2016, 22:44  [ТС] 3
Спасибо Kadagor, reset помог с проблемой вылета
Только создание статического плеера не решило проблему с обрывом воспроизведения

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

Цитата Сообщение от Kadagor Посмотреть сообщение
Насколько я понял в медиаплеере уже указан необходимый файл. Есть ли смысл "переуказывать"?
В принципе да, но так я буду ограничен в способе открытия интента с картинкой, лучше все-таки "переуказывать"
0
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 51
25.02.2016, 21:59 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;
     }
1
25.02.2016, 21:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2016, 21:59

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

Использование MediaPlayer
Здравствуйте. Задача такова: написать свой простейший плеер сугубо для себя. Почитав, понял, что...

Не удается создать mediaplayer
Пишу на android studio, приложение запускается все нормально. Но в отладке пишет, Unable to to...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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