Создать () не удается в MediaPlayer - Android - PullRequest
0 голосов
/ 12 января 2011

Я пытаюсь воспроизвести несколько музыкальных файлов (в формате WAV) на основе нажатия кнопок.Я не могу заставить MediaPlayer работать должным образом.Каждый раз, когда я пытаюсь создать экземпляр объекта класса MediaPlayer, происходит сбой при создании ().Перед тем, как опубликовать код, я расскажу о том, что я делаю:
1. Файл макета, содержащий 2 кнопки.
2. Эти кнопки считываются и для них определены onClickListeners.В зависимости от нажатой кнопки вызывается функция playAudioFile(View), которая создает экземпляр MediaPlayer и воспроизводит файл.Код для playAudioFile (View) выглядит следующим образом:

   public void playAudioFile(View v) {
        /*Steps:
         * 1. Take in id of the button.
         * 2. Using id, identify what file needs to be played.
         * 3. Play file.
         */

        String path_to_file = null;   //this is the path to the file.

        if(b01.getId() == ((Button)v).getId()) {
            Log.v(this.toString(), "Button 01 pressed.");
            path_to_file = "/sdcard/audio/temp1.wav";
        } else if(b02.getId() == ((Button)v).getId()) {
            Log.v(this.toString(), "Button02 pressed.");
            path_to_file = "/sdcard/audio/temp2.wav";
        }
        path_to_file = "file://" + path_to_file;
        Uri streamUri = Uri.parse(path_to_file);
        Log.v(this.toString(), "Path of file = " + path_to_file);
        MediaPlayer mp = MediaPlayer.create(this, streamUri);

        if(mp == null) {
            Log.v(this.toString(), "Create() on MediaPlayer failed.");
        }

        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                // TODO Auto-generated method stub
                try {
                    mp.start();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                    Log.v(this.toString(), "Illegal state exception thrown in start.");
                }
            }
        });

        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mp.release();
            }
        });
    }

Я прошел много постов здесь по stackoverflow, в которых подробно описаны решения вышеуказанной проблемы.Я столкнулся с этой проблемой после включения всех предложений, сделанных в нем.Любая помощь приветствуется.

Спасибо,
Шрирам

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Если я не ошибаюсь, вы не можете использовать onPrepare, потому что mp.prepare () вызывается внутри MediaPlayer.create (). Самый простой код может быть примерно таким:

MediaPlayer mp = MediaPlayer.create(this, streamUri);
mp.start();

Если вы хотите что-то более сложное, вы можете попробовать это:

MediaPlayer mp = MediaPlayer.create(this, streamUri);        
if(mp == null) {            
    Log.v(this.toString(), "Create() on MediaPlayer failed.");       
} else {
    mp.setOnCompletionListener(new OnCompletionListener() {

    @Override
      public void onCompletion(MediaPlayer mp) {
          //here you should call the methods to release memory
          mp.stop();
          mp.release();
      }
    });
    mp.start();

}

Скажите, помогло ли это вам.

PD: лучше, если вы используете устройство для тестирования, а не симулятор. Некоторые классы там не работают должным образом (MediaPlayer не может воспроизводить видео в симуляторах), и я не помню, поддерживает ли он аудио.

2 голосов
/ 12 января 2011

Я не понимаю, почему вы пытаетесь сделать

MediaPlayer mp = MediaPlayer.create(this, streamUri);

Это моя реализация моего проигрывателя, надеюсь, это поможет вам в некотором роде:

MediaPlayer mp = new MediaPlayer();

        setContentView(R.layout.player);

        Intent intent = getIntent();

        String path = "";

        System.out.println("My Scheme : "+intent.getData().toString().substring(8));

        if (intent.getData().getScheme().equals("video")) {

            path = intent.getData().toString().substring(8);
            System.out.println("Path : "+path);

            if(path.endsWith(".mp3")) {
            setContentView(R.layout.musicplayer);
            setContentView(R.layout.controls);

                Log.e("MusicPlayer", "Playing: " + path);
                try {

                    Notification notification = new Notification(
                            R.drawable.playbackstart, path, System.currentTimeMillis());
                    nm.notify(NOTIFY_ID, notification);

                    mp.reset();
                    mp.setDataSource(path);
                    mp.prepare();
                    mp.start(); 
                    mp.setOnCompletionListener(new OnCompletionListener() {

                        public void onCompletion(MediaPlayer arg0) {
                            System.out.println("Hi i am at the End");

                        }
                    });
                }catch {expression}
0 голосов
/ 29 июня 2017

Насколько я понимаю, ваша проблема: вы вызываете метод MediaPlayer.create(...), и он возвращает null, что означает, что создание MediaPlayer instance не удалось.Согласно принятому ответу на этот пост MediaPlayer.create () всегда возвращает ноль , это связано с corrupted audio file.

У меня также есть проблема, когда звук воспроизводится, но прив редких случаях метод create () также возвращает ноль.Я использую звуки в пошаговой игре, после каждого хода играется звук.Я всегда вызываю метод create, запускаю проигрыватель и отпускаю его по окончании.Это происходит каждый ход, и, как раз в 300 ходов, метод create возвращает нуль ... Так что в моем случае это должно быть что-то еще.В вашем случае это может быть связано с повреждением mp3 файла.

...