0

大家好我要製作MP3播放器和firebase存儲的歌曲。我能夠運行這首歌第一次,當我改變了歌應用程序是不幸停止,給我這個錯誤帶有Firebase多媒體文件的Android媒體播放器

07-29 23:24:17.359 23466-23466/com.example.daniyal.audioplayer E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.daniyal.audioplayer, PID: 23466 
                      java.lang.IllegalStateException 
                       at android.media.MediaPlayer.nativeSetDataSource(Native Method) 
                       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1071) 
                       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1032) 
                       at com.example.daniyal.audioplayer.MainActivity$4.onSuccess(MainActivity.java:82) 
                       at com.example.daniyal.audioplayer.MainActivity$4.onSuccess(MainActivity.java:76) 
                       at com.google.android.gms.tasks.zzj.run(Unknown Source) 
                       at android.os.Handler.handleCallback(Handler.java:739) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:135) 
                       at android.app.ActivityThread.main(ActivityThread.java:5343) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:372) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

我的代碼是在這裏:

MediaPlayer mediaPlayer; 
FirebaseStorage firebaseStorage; 
Button btn1 , btn2; 
String jai = "https://firebasestorage.googleapis.com/v0/b/audioplayer-49893.appspot.com/o/jai.mp3?alt=media&token=f315beb6-83ea-44f0-9beb-91d5108d9baa"; 
String tose = "https://firebasestorage.googleapis.com/v0/b/audioplayer-49893.appspot.com/o/tose.mp3?alt=media&token=4b3d9449-ff26-4fe4-9f5c-b5d3e006a640"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    btn1 = (Button) findViewById(R.id.jai); 
    btn2 = (Button) findViewById(R.id.tose); 

    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

    btn1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
       playjai(); 
     } 
    }); 
    btn2.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
     playtose(); 

     } 
    }); 

} 

public void playjai(){ 

    if (mediaPlayer.isPlaying()){ 
     mediaPlayer.stop(); 
    } 
    playmusic(jai); 

} 

public void playtose(){ 
    if (mediaPlayer.isPlaying()){ 
     mediaPlayer.stop(); 
    } 
    playmusic(tose); 

} 

private void playmusic(String url){ 

    firebaseStorage = FirebaseStorage.getInstance(); 
    StorageReference storageRef = firebaseStorage.getReferenceFromUrl(url); 
    storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { 
     @Override 
     public void onSuccess(Uri uri) { 
      try { 
       // Download url of file 
       String url = uri.toString(); 
       mediaPlayer.setDataSource(url); 
       // wait for media player to get prepare 
       mediaPlayer.setOnPreparedListener(MainActivity.this); 
       mediaPlayer.prepareAsync(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    }) 

      .addOnFailureListener(new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception e) { 
        Log.i("TAG", e.getMessage()); 
       } 
      }); 


} 


@Override 
public void onPrepared(MediaPlayer mediaPlayer) { 
    try { 
     mediaPlayer.start(); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
} 

}

我剛剛添加了兩個用於測試應用程序的按鈕。第一次點擊任何按鈕開始播放歌曲時,我點擊另一個按鈕的應用程序將被停止。

回答

3

非常仔細地研究MediaPlayer state diagram及其說明。任何時候您在MediaPlayer上調用方法時,都必須遵守有效的狀態轉換,否則會拋出IllegalStateException。

當MediaPlayer處於空閒狀態時,您只能撥打setDataSource()。你試圖在第一次玩遊戲之後再次調用它。如果您想重複使用同一個MediaPlayer實例,則需要在其上調用reset()將其重新發送回空閒狀態,然後再次調用setDataSource()

+0

嘿道格史蒂文森,感謝您的解釋。只是在應用之前理解圖表:) –