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

嘿道格史蒂文森,感谢您的解释。只是在应用之前理解图表:) –