MediaPlayer isPlaying () всегда возвращает false - PullRequest
3 голосов
/ 29 ноября 2011

Я тестирую на 2 телефонах.В одном устройстве isPlaying () медиаплеера всегда возвращает false, даже когда он играет.но в другом устройстве (lg optimus gingerbread) isPlaying () возвращает true, если он играет, иначе возвращает false.

Может кто-нибудь сказать мне, почему это происходит?Мой некоторый код зависит от этой части isPlaying (), и я хочу, чтобы она работала на всех устройствах.

public void addSoundMedia(Context context, int resId){
    MediaPlayer mp = MediaPlayer.create(context, resId);
    mp.setVolume(1.0f, 1.0f);
    try{
    mPlayerList.add(mp);
    }
    catch(Exception e){}
}

public void playSoundMedia(int index){
    try{        
    mPlayerList.get(index).start();         
    }
        catch(Exception e){}
}


public MediaPlayer getPlayer(int index){
    return mPlayerList.get(index);
}

Теперь я звоню

mPlayer.getPlayer(currentPlayingPhraseIndex).isPlaying(); 
//which is now returning false. Previously i was returning true but now it always return false

И я также сопоставил объект,теперь это сценарий кода:

int phraseIndexToBePlayed = getRandomInteger(0, numberOfPhrasesSelected-1, randomPhraseGen); //get random index from 0 to (size of arraylist where i added my media) -1
currentPlayingPhraseIndex = phraseIndexToBePlayed; //for later use in another function scope

mPlayer.playSoundMedia(phraseIndexToBePlayed);

Я также проверил, являются ли оба носителя одинаковыми

mPlayer.getPlayer(currentPlayingPhraseIndex).equals(mPlayer.getPlayer(phraseIndexToBePlayed)); //it returns true so they are both same media

Спасибо.

Ответы [ 2 ]

5 голосов
/ 30 ноября 2011

MediaPlayer очень странный и очень хрупкий. У вас есть очень мало что вы можете сделать, чтобы сказать, в каком состоянии он находится - и все, что вы знаете, может в конечном итоге ошибаться.

В качестве примечания я обнаружил, что иногда Eclipse может заставить приложения делать ОЧЕНЬ странные, необъяснимые вещи. Очистка проекта и перезапуск Eclipse, а также удаление и переустановка приложения, как правило, решают эти действительно неприятные вещи, поэтому всегда старайтесь делать это, когда обнаружите ошибку, которая кажется невозможной.

При работе с MediaPlayer следите за тем, что он должен делать, и никогда не верьте, что MediaPlayer будет в том же состоянии, в котором вы его оставили. Каждый раз, когда вы что-нибудь делаете с MediaPlayer, будьте готовы к этому прекрасному IllegalStateException - возможно, оно воспроизводилось, может быть, оно было подготовлено, может быть, оно было приостановлено, но вы должны быть готовы к тому, что в любой момент оно может быть в неправильном состоянии. Когда вы пишете свой код таким образом, вы меньше полагаетесь на точность isPlaying ().

Не полезно, я знаю, но, к сожалению, у нас не так много альтернатив MediaPlayer.

1 голос
/ 01 декабря 2011

Кроме того, пока мы находимся на общей теме MediaPlayer, обратите внимание, что isPlaying () может вызвать ANR при вызове в потоке пользовательского интерфейса.Фактически, Google рекомендует выполнять все вызовы MediaPlayer из потока фонового обработчика.Который также сериализует выполнение вызовов MediaPlayer.

...