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