Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android媒体播放器库出现问题_Java_Android_Firebase - Fatal编程技术网

Java android媒体播放器库出现问题

Java android媒体播放器库出现问题,java,android,firebase,Java,Android,Firebase,我试图制作一个音乐应用程序,从firebase加载歌曲Url、歌曲名称和艺术家名称。我有两个活动,一个是ExtrasActivity。ExtrasActivity包含一个在列表中加载歌曲的recyclerview,当我们单击该项目时,它会将songUrl、SongName和ArtistName发送给另一个名为StackActivity的活动。我在StackActivity中遇到了问题,比如当播放歌曲时,如果我回击并播放另一首歌曲,那么有时它工作正常,但有时它同时播放两首歌曲。 我尝试了很多方法来

我试图制作一个音乐应用程序,从firebase加载歌曲Url、歌曲名称和艺术家名称。我有两个活动,一个是ExtrasActivity。ExtrasActivity包含一个在列表中加载歌曲的recyclerview,当我们单击该项目时,它会将songUrl、SongName和ArtistName发送给另一个名为StackActivity的活动。我在StackActivity中遇到了问题,比如当播放歌曲时,如果我回击并播放另一首歌曲,那么有时它工作正常,但有时它同时播放两首歌曲。 我尝试了很多方法来解决这个问题,但没有一个能正常工作。我认为我的活动中存在问题

以下是我的活动:-

public class StackActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {

    private MediaPlayer mediaPlayer;
    private Boolean isPlaying = false;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.stack_activity_name);

        SeekBar Song_playing_seekbar;

        TextView songInfoSong = findViewById(R.id.song_info_song);
        TextView songInfoArtist = findViewById(R.id.song_info_artist);

        songInfoSong.setText(getIntent().getStringExtra("Name"));
        songInfoArtist.setText(getIntent().getStringExtra("Artist"));

        mediaPlayer = new MediaPlayer();

        playSong();

    }

    private void playSong() {
        final FirebaseStorage storage = FirebaseStorage.getInstance();

        StorageReference storageReference = storage.getReferenceFromUrl(getIntent().getStringExtra("SongUrl"));

        storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {

                try {


                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    final String url = uri.toString();
                    mediaPlayer.setDataSource(url);
                    mediaPlayer.setOnPreparedListener(StackActivity.this);
                    mediaPlayer.prepareAsync();


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

                }


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


    }

    @Override
    public void onPrepared(final MediaPlayer mediaPlayer) {

        CheckIfSongIsPlayingOrNot();

        if (isPlaying == false) {
            mediaPlayer.start();
        } else if (isPlaying == true) {
            mediaPlayer.stop();
        }

    }

    private void CheckIfSongIsPlayingOrNot() {
        if (mediaPlayer.isPlaying()) {
            isPlaying = true;
        } else if (!mediaPlayer.isPlaying()) {
            isPlaying = false;
        }
    }
公共类StackActivity扩展AppCompatActivity实现MediaPlayer.OnPreparedListener{
私人媒体播放器;
私有布尔isplay=false;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.stack\u activity\u name);
SeekBar Song_playing_SeekBar;
TextView-songInfoSong=findViewById(R.id.song\u-info\u-song);
TextView-songInfoArtist=findViewById(R.id.song\u-info\u-artist);
songfosong.setText(getIntent().getStringExtra(“名称”);
songInfoArtist.setText(getIntent().getStringExtra(“艺术家”));
mediaPlayer=新的mediaPlayer();
播放歌曲();
}
私人播放歌曲(){
最终FirebaseStorage存储=FirebaseStorage.getInstance();
StorageReference-StorageReference=storage.getReferenceFromUrl(getIntent().getStringExtra(“SongUrl”);
storageReference.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
试一试{
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
最后一个字符串url=uri.toString();
mediaPlayer.setDataSource(url);
mediaPlayer.setOnPreparedListener(StackActivity.this);
mediaPlayer.prepareAsync();
}捕获(例外e){
e、 printStackTrace();
}
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.i(“标记”、“失败”);
}
});
}
@凌驾
已准备公开作废(最终MediaPlayer MediaPlayer){
CheckIfSongIsPlayingOrNot();
如果(显示==假){
mediaPlayer.start();
}else if(isPlaying==true){
mediaPlayer.stop();
}
}
私有无效检查ifSongisplayingornot(){
if(mediaPlayer.isPlaying()){
isplay=true;
}如果(!mediaPlayer.isPlaying()),则为else{
isplay=false;
}
}

因此,如果您发现任何问题,请帮助我改进。

这是因为每次启动
StackActivity
时都会重新创建
MediaPlayer
。我甚至想知道为什么不是每次都会发生这种情况。更确切地说,旧的
MediaPlayer
实例从未停止过,甚至更重要的是从未发布过。您应该我们应该更仔细地观察这些国家

但是对于这个特定的案例,我会尝试定义一个MediaPlayer

公共类MediaPlayerSingleton实现MediaPlayer.OnPreparedListener{
私有静态MediaPlayerSingleton实例=null;
私有媒体播放器MediaPlayer=null;
私有媒体播放器Singleton(){
mediaPlayer=新的mediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(这个);
}
公共静态MediaPlayerSingleton getInstance(){
if(实例==null){
实例=新的MediaPlayerSingleton();
}
返回实例;
}
@凌驾
公共无效已准备好(MediaPlayer MediaPlayer){
恢复();
}
/**
*这将把给定的URL加载到媒体播放器中。
*@param url来自Firebase Uri的url字符串。
*/
公共无效播放(字符串url){
试一试{
mediaPlayer.reset()
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共空间暂停(){
mediaPlayer.pause();
}
公众简历(){
mediaPlayer.start();
}
公共停车场(){
mediaPlayer.stop();
}
公开无效释放(){
mediaPlayer.release();
}
}
然后,您可以在StackActivity中使用它

公共类StackActivity扩展了AppCompatActivity{
//您的onCreate()但不包括MediaPlayer引用
私人播放歌曲(){
FirebaseStorage=FirebaseStorage.getInstance();
StorageReference-StorageReference=storage.getReferenceFromUrl(getIntent().getStringExtra(“SongUrl”);
storageReference.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
MediaPlayerSingleton.getInstance().play(uri.toString());
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.i(“标记”、“失败”);
}
});
}
}
但是请确保在开始活动的
onDestroy()
(例如
extracasctivity
)中调用此单例的
release()
函数,如下所示:

@覆盖
受保护的空onDestroy(){
super.ondestory();
MediaPlayerSingleton.getInstance().release();
}
必须这样做才能释放内存

只是单身前妻的一个旁注