Проблемы с Android MediaPlayer

1

Я запускаю MediaPlayer для воспроизведения звука нажатием кнопки. Иногда игрок воспроизводит весь звук, иногда он не будет. Он всегда прерывается на конце. Я прочитал несколько тем, где люди сталкивались с одной и той же проблемой, но ни одно из предложений не работало. Например, кто-то сказал, что добавление mediaPlayer.onCompletionListener() устранит проблему, но это не так.

Вот код с MediaPlayer:

public View getView(int position, View convertView, ViewGroup parent) {



    LayoutInflater inflater = getLayoutInflater();
    View row = inflater.inflate(R.layout.vocab_row, parent, false);

    ImageView playIcon = (ImageView) row
                .findViewById(R.id.blueplay_icon);
TextView vocabWord = (TextView) row
        .findViewById(R.id.vocab_text_word);
TextView vocabMeaning = (TextView) row
        .findViewById(R.id.vocab_text_meaning);

vocabWord.setText(data.get(position).getKey());
vocabMeaning.setText(data.get(position).getDefinition());

final String fileName = "audio/" + data.get(position).getAudio();

// set the click listener for the play button
playIcon.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {

        final MediaPlayer player = new MediaPlayer();
        AssetManager manager = SingleLesson.this.getAssets();
        final AssetFileDescriptor descriptor;

        try {

            descriptor = manager.openFd(fileName);
            long start = descriptor.getStartOffset();
            long end = descriptor.getLength();

            //reset player 
            if (player != null) {
                player.reset();
            }

            player.setDataSource(descriptor.getFileDescriptor(),
                    start, end);

        } catch (IOException e) {
            Log.e("IO EXCEPTION: ", "while getting mp3 assets.");
            e.printStackTrace();
        }

        // set volume
        player.setVolume(100, 100);

        try {
            player.prepare();
        } catch (IllegalStateException e) {
            Log.e("ERROR: ", "media player, illegal state");
            e.printStackTrace();
        } catch (IOException e) {
            Log.e("ERROR: ", "media player, IO exception");
            e.printStackTrace();
        }

        player.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer inPlayer) {
                player.start();
            }
        });

        // called when the file is finished playing
        player.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer player) {
                player.stop();
                player.release();
            }

        });
    }

Эта проблема происходит на эмуляторе, но не на моем htc невероятном. Это также не происходит на моей девушке moto droid2, но у звуков есть "клики" в них на moto droid2.

Теги:

2 ответа

1

Сколько лет эмулятору? Я видел проблемы с файлами эмуляторов, которые становятся коррумпированными через некоторое время. Если он не новый, попробуйте создать его.

  • 0
    Спасибо за ответ, но это ничего не исправило. По-видимому, это происходит на некоторых телефонах - пользователь отправил письмо с жалобой на это, однако мне еще не удалось воспроизвести проблему ни в чем, кроме эмулятора.
  • 0
    привет bytebender вы можете решить мою проблему stackoverflow.com/questions/14544848/…
0

У меня есть пара предложений для вас. Он может работать или не работать. MediaPlayer.prepare() - это синхронный метод, который означает, что он будет завершен до того, как будет запущен какой-либо другой код в строке, поэтому вам не нужно onPreparedListener, чтобы начать воспроизведение. вы можете просто набрать MediaPlayer.start() ниже метода подготовки. Другое предложение, так как вы хотите воспроизвести звук снова и снова, вы просто не хотите выпускать медиаплеер. Попробуйте применить метод MediaPlayer.reset() в onCompletionListener. Надеюсь, он решает проблему. Вы также можете попробовать добавить MediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); перед методом setDataSource.

Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню