2013-07-25 27 views
9

Tôi đang học Android và tôi đã tạo một hoạt động có hai nút: Nút ToggleButton (Phát/Tạm dừng) và nút (Tiếp theo). Tôi có hai bài hát muốn đạp xe khi nhấn Next. Tôi có một mảngMediaPlayer: Không thể mở tệp ở phía máy khách; Lỗi (-38,0) và nhiều hơn nữa

int [] songs={R.raw.song1,R.raw.song2};

Tôi overrode các onClick trong Hoạt động của tôi. Bài hát đầu tiên chơi tốt; nhưng sau khi nhấn Next, tôi nhận được các lỗi sau đây:

Không thể mở tập tin về phía khách hàng, cố gắng phía máy chủ

E/MediaPlayer (3107): bắt đầu được gọi là trong tình trạng 4

E/MediaPlayer (3107): lỗi (-38, 0)

E/MediaPlayer (3107): lỗi (-38,0)

E/MediaPlayer (3107): lỗi (1, -2147483648)

E/MediaPlayer (3107): Lỗi (1, -2147483648)

Trong onCreate (Bundle ...),

if(mp!=null) mp.release(); 
    mp=MediaPlayer.create(this, songs[count]); 

Dưới đây là tôi onClick (View v) Phương pháp:

public void onClick(View view) {  
    Log.v(TAG,"ID:"+view.getId()); 
    switch (view.getId()) { 
    case R.id.playerbutton: //ToggleButton 
     if(state==0) { 
      mp.start(); 
      state=1; 
     } 
     else if(state==1) { 
      state=0; 
      mp.pause(); 
     } 
    break; 

    case R.id.next: //Next button 
     Log.v(TAG,"Next button pressed!"); 
     count=(count+1)%2; //Have only two songs 
     mp.reset(); 
     try { 
      mp.setDataSource(this, Uri.parse("android.resource://com.example.myfirstapp"+songs[count])); 
      mp.setOnPreparedListener(this); 
      mp.prepareAsync(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     mp.start(); 
    break; 
    } 
} 

Về cơ bản, tôi làm điều này cho mỗi lần bấm nút Tiếp theo: -reset mp (ví dụ: đối tượng MediaPlayer) -Đặt một nguồn dữ liệu mới để chơi bài hát tiếp theo mp -Bắt đầu

Đối với sử dụng setOnPreparedListener hoặc prepareAsync, tôi đọc this SO question.

Tôi sẽ làm gì sai?

+0

bản sao có thể có của [Sự cố Android MediaPlayer: "Lỗi (-38, 0)" và "dừng được gọi trong trạng thái 1"] (http://stackoverflow.com/questions/11913108/android-mediaplayer-problems-error- 38-0-and-stop-called-in-state-1) – rds

Trả lời

7

Tôi tin rằng bạn đang đặt nguồn dữ liệu sai.

Thay đổi nó để:

mp.setDataSource(this, Uri.parse("android.resource://com.example.myfirstapp/"+songs[count])); 

Chú ý các dấu gạch chéo sau tên gói.

+0

Vâng, không để ý! Ngoài ra, tôi đã thay thế 'preparAsync' bằng' prepare() 'vì tôi đang phát từ một tệp (không phải luồng). Cảm ơn!! –

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