Tôi đã xuất bản ứng dụng gần đây và người dùng báo cáo sự cố do chương trình của tôi đã bao gồm phương thức setNextMediaPlayer()
. Bây giờ tôi nhận ra rằng này chỉ hoạt động với API 16+ và ứng dụng của tôi hỗ trợ API 8+. Tôi đã tự hỏi nếu có một cách khác để đạt được hiệu quả tương tự.Android MediaPlayer setNextMediaPlayer() thay thế
Ứng dụng của tôi có một số văn bản thành lời nói và những gì tôi đang làm là tạo một ArrayList
trong số MediaPlayers
mỗi tệp có một tệp âm thanh ngắn và sau đó phát từng tệp một. Nếu tôi xóa phương thức này khỏi mã, âm thanh trở nên quá khó hiểu.
Tôi đã suy nghĩ về việc sử dụng lớp SoundPool
, nhưng không có OnCompleteListener
, vì vậy tôi không chắc chắn cách tôi sẽ làm điều đó.
Vì vậy, về cơ bản câu hỏi của tôi là: Có cách nào để chuyển đổi liền mạch giữa các tệp âm thanh mà không sử dụng phương thức setNextMediaPlayer()
không?
Cảm ơn bạn rất nhiều vì đã dành thời gian!
EDIT
tôi thêm mã này mà tôi tìm thấy
private class CompatMediaPlayer extends MediaPlayer implements OnCompletionListener {
private boolean mCompatMode = true;
private MediaPlayer mNextPlayer;
private OnCompletionListener mCompletion;
public CompatMediaPlayer() {
try {
MediaPlayer.class.getMethod("setNextMediaPlayer", MediaPlayer.class);
mCompatMode = false;
} catch (NoSuchMethodException e) {
mCompatMode = true;
super.setOnCompletionListener(this);
}
}
public void setNextMediaPlayer(MediaPlayer next) {
if (mCompatMode) {
mNextPlayer = next;
} else {
super.setNextMediaPlayer(next);
}
}
@Override
public void setOnCompletionListener(OnCompletionListener listener) {
if (mCompatMode) {
mCompletion = listener;
} else {
super.setOnCompletionListener(listener);
}
}
@Override
public void onCompletion(MediaPlayer mp) {
if (mNextPlayer != null) {
// as it turns out, starting a new MediaPlayer on the completion
// of a previous player ends up slightly overlapping the two
// playbacks, so slightly delaying the start of the next player
// gives a better user experience
SystemClock.sleep(50);
mNextPlayer.start();
}
mCompletion.onCompletion(this);
}
}
Nhưng bây giờ làm thế nào để thêm các tập tin âm thanh? Tôi cố gắng này:
// assigns a file to each media player
mediaplayers = new ArrayList<CompatMediaPlayer>();
for (int i = 0; i < files.size(); i++) {
mediaplayers.add((CompatMediaPlayer) CompatMediaPlayer.create(this, files.get(i)));
}
nhưng tôi nhận được một ngoại lệ lớp diễn viên vì MediaPlayer không thể được đúc để CompatMediaPlayer.
Nếu bạn sẵn sàng xử lý giải mã trong ứng dụng của mình (hoặc gửi tệp âm thanh dưới dạng PCM chưa mã hóa), bạn có thể sử dụng API 'AudioTrack' hoặc OpenSL ES. – Michael
Cảm ơn, tôi sẽ kiểm tra ES OpenSL, có vẻ tốt – user2397906