Проблемы с MediaPlayer, исходные ресурсы, остановка и запуск
Я новичок в разработке Android, и у меня есть вопрос/проблема.
Я играю с классом MediaPlayer для воспроизведения некоторых звуков/музыки. Я играю в сырые ресурсы (res/raw
), и это выглядит просто.
Чтобы воспроизвести необработанный ресурс, MediaPlayer должен быть инициализирован следующим образом:
MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();
Пока здесь нет проблем. Звук воспроизводится, и все работает нормально. Моя проблема возникает, когда я хочу добавить дополнительные параметры в свое приложение. В частности, когда я добавляю кнопку "Stop" /опцию.
В принципе, я хочу, чтобы... когда я нажимаю "Стоп", музыка останавливается. И когда я нажимаю "Старт", песня/звук начинается. (довольно простой!)
Чтобы остановить медиаплеер, вам нужно только позвонить stop()
. Но для повторного воспроизведения звука медиаплеер должен быть сброшен и подготовлен.
mp.reset();
mp.setDataSource(params);
mp.prepare();
Проблема заключается в том, что метод setDataSource()
принимает только как параметры, путь к файлу, URL-адрес поставщика контента, путь к потоковым медиа-ресурсам или дескриптор файла.
Итак, поскольку этот метод не принимает идентификатор ресурса, я не знаю, как установить источник данных, чтобы вызвать prepare()
. Кроме того, я не понимаю, почему вы не можете использовать идентификатор Resouce для установки источника данных, но при инициализации MediaPlayer вы можете использовать идентификатор ресурса.
Думаю, я что-то упустил. Интересно, смешиваю ли я понятия, а метод stop()
не нужно вызывать в кнопке "Стоп". Любая помощь?
Спасибо заранее!
Ответы
Ответ 1
Вот что я сделал, чтобы загрузить несколько ресурсов с помощью одного MediaPlayer:
/**
* Play a sample with the Android MediaPLayer.
*
* @param resid Resource ID if the sample to play.
*/
private void playSample(int resid)
{
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
try
{
mediaPlayer.reset();
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mediaPlayer.prepare();
mediaPlayer.start();
afd.close();
}
catch (IllegalArgumentException e)
{
Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
}
catch (IllegalStateException e)
{
Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
}
catch (IOException e)
{
Log.e(TAG, "Unable to play audio queue do to exception: " + e.getMessage(), e);
}
mediaPlay - это переменная-член, которая создается и освобождается в других точках класса. Это может быть не лучшим образом (я новичок в Android самостоятельно), но, похоже, это работает. Просто отметьте, что код, вероятно, попадет в нижнюю часть метода до того, как будет запущен проигрыватель mediaPlayer. Если вам нужно воспроизвести ряд ресурсов, вам все равно придется обрабатывать этот случай.
Ответ 2
вот как метод MediaPlayer.create работает, чтобы открыть необработанный файл:
public static MediaPlayer create(Context context, int resid) {
try {
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
if (afd == null) return null;
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
return mp;
} catch (IOException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (IllegalArgumentException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
} catch (SecurityException ex) {
Log.d(TAG, "create failed:", ex);
// fall through
}
return null;
}
Ответ 3
Или вы можете получить доступ к ресурсу таким образом:
mediaPlayer.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/song"));
где com.package.name - это имя вашего пакета приложений
Ответ 4
Вы можете использовать
mp.pause();
mp.seekTo(0);
чтобы остановить музыкальный проигрыватель.
Ответ 5
Наконец, как это работает для меня:
public class MainStart extends Activity {
ImageButton buttonImage;
MediaPlayer mp;
Boolean playing = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonImage = (ImageButton)findViewById(R.id.ButtonID);
buttonImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(playing){
mp.stop();
playing = false;
}else{
mp = MediaPlayer.create(getApplicationContext(), R.raw.sound_u_want);
mp.start();
playing = true;
}
}
});
}
}
Ответ 6
MR. Rectangle, это сообщение может быть слишком поздно для этого, но я с гордостью напишу эти коды к вашей идее: у меня mp
для mediaplayer
и sescal9
есть button
.
....
if(btnClicked.getId() == sescal9_ornek_muzik.getId())
{
mp.start();
mp.seekTo(380);
mp2.start();
mp2.seekTo(360);
mp3.start();
mp3.seekTo(340);
...
}