Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 21.02.2016
Сообщений: 32

Static MediaPlayer

21.02.2016, 11:33. Показов 990. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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);" Ошыбка : Error:(39, 41) error: constructor...

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

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

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

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

Цитата Сообщение от Kadagor Посмотреть сообщение
Насколько я понял в медиаплеере уже указан необходимый файл. Есть ли смысл "переуказывать"?
В принципе да, но так я буду ограничен в способе открытия интента с картинкой, лучше все-таки "переуказывать"
0
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 57
25.02.2016, 21:59
Для удобства объявим отдельную функцию
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2016, 21:59
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru