2012-04-24 39 views
10

Tôi gặp vấn đề lạ. Tôi sử dụng phương pháp preparAsync với MediaPlayer, nhưng người nghe mà tôi tuyên bố không bao giờ bị sa thải. Tôi cố gắng phát trực tiếp nguồn cấp dữ liệu .mp3 trực tiếp từ Internet (đài phát thanh). Tôi sử dụng một phương pháp nội tuyến cho người nghe, nhưng tôi cũng đã thử triển khai giao diện mà không thành công. Dưới đây là một phần của mã của tôi:AndroId MediaPlayer phương pháp chuẩn bịPhương pháp đồng bộ

Trong phần thành viên:

String url = "http://<my_url>.mp3"; 
MediaPlayer mediaPlayer = new MediaPlayer(); 

Trong Hoạt động onCreate():

ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
playButton.setOnClickListener(this); 
playButton.clearFocus(); 
playButton.setClickable(false); 

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
    } 
}); 

preparePlayer(); 

Sau đó, đây là preparePlayer() phương pháp:

private void preparePlayer() { 
    if (mediaPlayer == null) { 
     mediaPlayer = new MediaPlayer(); 
    } 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    try { 
     mediaPlayer.setDataSource(url); 
     mediaPlayer.prepareAsync(); 

    } catch (IllegalArgumentException e) { 
     Toast.makeText(
       MyStreamActivity.this, 
       getResources().getString(R.string.erreurIllegalArgument), 
       Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     Toast.makeText(
       MyStreamActivity.this, 
       getResources().getString(R.string.erreurIllegalState), 
       Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Toast.makeText(
       MyStreamActivity.this, 
       getResources().getString(R.string.erreurIO), 
       Toast.LENGTH_LONG).show(); 
     e.printStackTrace(); 
    } 
} 

Và (chỉ cho các hồ sơ), các onDetroy() nơi tôi làm sạch:

private void releaseMediaPlayer() { 
    if (mediaPlayer != null) { 
     if(mediaPlayer.isPlaying()) { 
      mediaPlayer.stop(); 
     } 
     mediaPlayer.release(); 
     mediaPlayer = null; 
    } 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    releaseMediaPlayer(); 
} 
+0

nhật ký có nói gì về những gì xảy ra hoặc có lỗi không? Bạn có được phép internets? – zapl

Trả lời

10

Bạn đang thiết lập các OnPreparedListener trong bạn phương pháp Activity 's tạo và sau này, có thể, tạo ra một mới MediaPlayer trong phương thức preparePlayer() của bạn. Mọi thiết lập mới của MediaPlayer sẽ không có số prepareListener. Bạn cũng nên thêm một số errorlistener để tìm hiểu điều gì đang diễn ra.

Bạn có thể muốn di chuyển setOnPreparedListener gọi bên trong

if (mediaPlayer == null) { 
    mediaPlayer = new MediaPlayer(); 
} 

cũng như thiết lập một setOnErrorListener như vậy:

if (mediaPlayer == null) { 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setOnErrorListener(....); 
    mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
     public void onPrepared(MediaPlayer mp) { 
      ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
      playButton.setClickable(true); 
      mp.start(); 
     } 
    }); 
} 

Vui lòng thay đổi e.printStackTrace(); để

Log.e("tag", e.getMessage(), e); 

Hy vọng điều này giúp chúng tôi biết nếu bạn có bất kỳ dữ liệu nhật ký nào như thế này cũng sẽ hữu ích.

+0

Cảm ơn! Tôi đã sử dụng lời khuyên của bạn kiểm tra ans nếu nó là null trước. Nhưng điều đó không giải quyết được vấn đề của tôi. –

+0

Cảm ơn! Rất tốt giải thích – Manza

1

Bị tắt, tôi quên đề cập đến "@Override" trên phương thức bên trong của tôi. Như thế này:

mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     ToggleButton playButton = (ToggleButton) findViewById(R.id.playToggleButton); 
     playButton.setClickable(true); 
     mp.start(); 
    } 
}); 

Bây giờ mọi thứ hoạt động tốt. À ... gần như, vì phải mất thời gian để đệm ...

+0

D'oH !!! haha ... vui vì bạn đã tìm ra nó !! :) – petey

+1

khá cũ, nhưng tôi vẫn muốn chỉ ra rằng * câu lệnh @Override không tạo mã * và do đó không thể là giải pháp cho vấn đề này hoặc các vấn đề liên quan đến mã khác. Xem http://stackoverflow.com/a/8545586/2177061 để tham khảo. – Rick77

+0

Điều đó có lẽ không phải là nguyên nhân của vấn đề này. Tôi hiện đang gặp sự cố tương tự và cài đặt "Ghi đè" không có tác dụng. Trong khi ứng dụng ví dụ cũng không thiết lập nó. –

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