Проблемы с MediaPlayer, необработанными ресурсами, остановкой и запуском

Я новичок в разработке Android, и у меня есть вопрос / проблема.

Я играю с классом MediaPlayer, чтобы воспроизвести некоторые звуки / музыку. Я играю в сырые ресурсы (res/raw), и это выглядит довольно легко.

Чтобы воспроизвести необработанный ресурс, MediaPlayer должен быть инициализирован следующим образом:


MediaPlayer mp = MediaPlayer.create(appContext, R.raw.song);
mp.start();

Пока здесь нет проблем. Звук воспроизводится, все работает нормально. Моя проблема возникает, когда я хочу добавить дополнительные параметры в свое приложение. В частности, когда я добавляю кнопку / опцию «Стоп».

По сути, я хочу ... когда я нажимаю "Стоп", музыка останавливается. И когда нажимаю "Старт", песня / звук начинается заново. (довольно просто!)

Чтобы остановить медиаплеер, достаточно позвонить stop(). Но чтобы снова воспроизвести звук, медиаплеер необходимо перезагрузить и подготовить.


mp.reset();
mp.setDataSource(params);
mp.prepare();

Проблема в том, что метод setDataSource() принимает в качестве параметров только путь к файлу, URI поставщика контента, путь URL-адреса потокового мультимедиа или дескриптор файла.

Итак, поскольку этот метод не принимает идентификатор ресурса, я не знаю, как установить источник данных для вызова prepare(). Кроме того, я не понимаю, почему вы не можете использовать идентификатор Resouce для установки источника данных, но вы можете использовать идентификатор ресурса при инициализации MediaPlayer.

Думаю, я что-то упускаю. Интересно, смешиваю ли я концепции, и метод stop() не нужно вызывать в кнопке «Стоп». Любая помощь?

Заранее спасибо!!!


person arakn0    schedule 03.06.2010    source источник
comment
вы хотите просто приостановить медиаплеер или полностью остановить его и начать играть снова?   -  person Jorgesys    schedule 04.06.2010
comment
полностью остановитесь и сыграйте снова. Чтобы сделать паузу ... вы должны вызвать метод pause (), а затем start (), если вы хотите продолжить игру. Легко и работает. Проблема в том, что когда вы пытаетесь полностью остановиться и играть снова (как в любом музыкальном плеере)   -  person arakn0    schedule 04.06.2010
comment
У меня точно такая же проблема. Сейчас я создаю новый MediaPlayer каждый раз, когда начинаю песню. Я знаю, что он заполняет память ресурсами, но я также вызываю mp.release () в предыдущем используемом MediaPlayer. Думаю, это решает проблему с памятью. Другого решения не вижу.   -  person Catalin Morosan    schedule 05.08.2010
comment
у вас такая же проблема, вы как-то решали свою?   -  person mishkin    schedule 21.01.2011


Ответы (7)


Вот что я сделал, чтобы загрузить несколько ресурсов с помощью одного 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 завершит воспроизведение. Если вам нужно сыграть в серию ресурсов, вам все равно нужно будет разобраться с этим делом.

person Community    schedule 30.08.2010
comment
AssetFileDescriptor afd = context.getResources (). OpenRawResourceFd (остаток); отлично работает, но вроде не на всех телефонах. Я только что получил сообщение об ошибке от пользователя - жаль, что он говорит, что это за телефон - person mishkin; 21.01.2011

вот как 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;
    }
person mishkin    schedule 21.01.2011

Или вы можете получить доступ к ресурсу следующим образом:

mediaPlayer.setDataSource(context, Uri.parse("android.resource://com.package.name/raw/song"));

где com.package.name - это имя вашего пакета приложения

person petrica.martinescu    schedule 27.09.2011
comment
Это действительно только для Android 2.2 и новее. - person petrica.martinescu; 30.09.2011

Ты можешь использовать

mp.pause();
mp.seekTo(0);

чтобы остановить музыкальный проигрыватель.

person Rectangle    schedule 13.06.2010

Наконец, как это работает для меня:

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;
                }
            }
        });
    }
}
person MarcBilbo    schedule 11.05.2012

МИСТЕР. Прямоугольник, это сообщение может быть слишком поздно для него, но я с гордостью пишу эти коды для вашей идеи: у меня 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);
            ...
            }
person Bay    schedule 16.09.2013

Перепроверьте передаваемые параметры не равны нулю

Возможные причины

  1. Контекст может быть нулевым
  2. Ваш медиафайл может быть поврежден
person Ranjith Kumar    schedule 30.01.2020