【问题标题】:Android Media Player with Firebase Multiple Mp3 Files带有 Firebase 多个 Mp3 文件的 Android 媒体播放器
【发布时间】:2017-07-29 18:35:21
【问题描述】:

大家好,我想制作 Mp3 播放器和 firebase 存储上的歌曲。不幸的是,当我更改歌曲应用程序被停止并给我这个错误

时,我可以在第一次运行这首歌
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();
    }
}

}

我刚刚添加了两个用于测试应用程序的按钮。第一次单击任何按钮时,它开始播放歌曲,当我单击另一个按钮时,应用程序将停止。

【问题讨论】:

    标签: android firebase android-mediaplayer fatal-error firebase-storage


    【解决方案1】:

    仔细研究MediaPlayer state diagram 及其描述。任何时候调用 MediaPlayer 上的方法,它都必须符合有效的状态转换,否则会抛出 IllegalStateException。

    您只能在 MediaPlayer 处于空闲状态时调用 setDataSource()。在它已经为第一次播放设置之后,你试图第二次调用它。如果您想重用同一个 MediaPlayer 实例,则需要在其上调用 reset() 将其送回空闲状态,然后再对其再次调用 setDataSource()。

    【讨论】:

    • 嗨,Doug Stevenson,感谢您的解释。只是在申请前了解图表:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多