2013-08-27 40 views
7

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.

+0

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

+0

Cảm ơn, tôi sẽ kiểm tra ES OpenSL, có vẻ tốt – user2397906

Trả lời

6

Tạo chơi compat rằng sẽ làm việc với onCompletionListener để bắt đầu các cầu thủ tiếp theo như:

public void onCompletion(MediaPlayer mp) { 
    if (mCompatMode && mNextPlayer != null) { 
     mNextPlayer.prepare(); 
     mNextPlayer.start(); 
    } 
} 

Một nơi nào đó trong tầm kiểm soát constructor của bạn nếu có phương pháp (hoặc kiểm tra phiên bản SDK) có tên "setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

Xác định phương thức như sau:

public void setNextMediaPlayer(MediaPlayer next) { 
    if (mCompatMode) { 
     mNextPlayer = next; 
    } else { 
     super.setNextMediaPlayer(next); 
    } 
} 
+0

Cảm ơn bạn đã trả lời! Điều này có xảy ra trong lớp hoạt động của tôi không, hoặc tôi có cần tạo một lớp CompatPlayer mở rộng MediaPlayer không? – user2397906

+0

Đó là tùy thuộc vào bạn, ở đây trong câu trả lời tôi có lớp đó là lớp CompatMediaPlayer công khai và riêng tư, những người chia sẻ cùng một người nghe hoàn thành (bên trong, và cung cấp ngay cả với hoạt động, nếu có). Đó là lý do tại sao tôi có 'super.setNextMediaPlayer()' –

+0

Tôi hiểu, điều đó có ý nghĩa. Tuy nhiên bây giờ tôi đang gặp sự cố khi thêm tệp âm thanh vào trình phát đa phương tiện. Tôi đã chỉnh sửa câu hỏi của mình bằng mã. Bất kỳ ý tưởng? – user2397906

Các vấn đề liên quan