Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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
Android 如何跨所有活动和片段使用MediaPlayer的单个实例?_Android_Singleton_Android Mediaplayer_Audio Player_Android Music Player - Fatal编程技术网

Android 如何跨所有活动和片段使用MediaPlayer的单个实例?

Android 如何跨所有活动和片段使用MediaPlayer的单个实例?,android,singleton,android-mediaplayer,audio-player,android-music-player,Android,Singleton,Android Mediaplayer,Audio Player,Android Music Player,我有几个活动和片段可以显示SD卡上的歌曲,当我点击其中任何一个时,它就会播放。问题是我必须在这些活动和片段中创建一个新的媒体播放器实例。因此,如果我在一个活动中播放一首歌,在另一个活动中播放另一首歌,这两首歌将同时播放。我读过关于singleton类和使媒体播放器静态的文章,但我需要更多的信息。下面是我的代码 public class ArtistSongAlbumSong extends AppCompatActivity { ArrayList<SongInfoModel> A

我有几个活动和片段可以显示SD卡上的歌曲,当我点击其中任何一个时,它就会播放。问题是我必须在这些活动和片段中创建一个新的媒体播放器实例。因此,如果我在一个活动中播放一首歌,在另一个活动中播放另一首歌,这两首歌将同时播放。我读过关于singleton类和使媒体播放器静态的文章,但我需要更多的信息。下面是我的代码

public class ArtistSongAlbumSong extends AppCompatActivity {

ArrayList<SongInfoModel> ArtistSongAlbumSongList = new ArrayList<>();

RecyclerView recyclerView_artistalbumsongs;

ArtistSongAlbumSongAdapter artistSongAlbumSongAdapter;

private static MediaPlayer player = new  MediaPlayer();

Context isContext;

private int currentIndex;


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

    recyclerView_artistalbumsongs = findViewById(R.id.recyclerView_artistSongAllSong);

    isContext = ArtistSongAlbumSong.this;

    Long albumid = getIntent().getExtras().getLong("album_id");

    LinearLayoutManager aslinearLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView_artistalbumsongs.setLayoutManager(aslinearLayoutManager);


    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
    Cursor cursor = getApplicationContext().getContentResolver().query(uri, null, selection, null, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            do {
                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
                String nameArtist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
                String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
                Long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
                Long newAlbumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
                Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
                Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumid);

                if (newAlbumId.equals(albumid)) {

                    SongInfoModel s6 = new SongInfoModel(name, nameArtist, duration, data, albumArtUri);
                    ArtistSongAlbumSongList.add(s6);
                }

            } while (cursor.moveToNext());
        }


        cursor.close();

        Collections.sort(ArtistSongAlbumSongList, new Comparator<SongInfoModel>() {
            @Override
            public int compare(SongInfoModel lhs, SongInfoModel rhs) {
                return lhs.getSongName().compareTo(rhs.getSongName());
            }
        });


    }





    artistSongAlbumSongAdapter = new ArtistSongAlbumSongAdapter(getApplicationContext(), ArtistSongAlbumSongList);

    artistSongAlbumSongAdapter.onItemClickListener(new ArtistSongAlbumSongAdapter.ArtistSongAlbumSongListener() {
        @Override
        public void onClickListener(SongInfoModel songInfoModel, int position, RelativeLayout relativeLayout, View view) {
            MainActivity.setsongText(songInfoModel);
            MainActivity.ButtonPlay();
            MainActivity.PauseImage();

            changeSelectedSong(position);
            prepareSong(songInfoModel);

        }

        @Override
        public void onLongClickListener(SongInfoModel songInfoModel, int position, RelativeLayout relativeLayout, View view) {

        }
    });

    recyclerView_artistalbumsongs.setAdapter(artistSongAlbumSongAdapter);


    player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {

            togglePlay(mediaPlayer);

        }
    });

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            onSongCompletion1(mediaPlayer);
        }
    });




}



public void prepareSong(SongInfoModel song) {

    player.reset();


    try {
        player.setDataSource(song.getData());
        player.prepareAsync();
    } catch (IOException e) {
        e.printStackTrace();
    }

}


private void togglePlay(MediaPlayer mp) {

    if (mp.isPlaying()) {
        mp.stop();
        mp.reset();

    } else {

        mp.start();


        MainActivity.Handler(mp);


    }


}

private void changeSelectedSong(int index){
  //  artistSongAlbumSongAdapter.notifyItemChanged(artistSongAlbumSongAdapter.getSelectedPosition());
    currentIndex = index;
    artistSongAlbumSongAdapter.setSelectedPosition(currentIndex);
  //  artistSongAlbumSongAdapter.notifyItemChanged(currentIndex);

}




private void onSongCompletion1(MediaPlayer mediaPlayer) {


    if(currentIndex + 1 < ArtistSongAlbumSongList.size()){
        SongInfoModel next  = ArtistSongAlbumSongList.get(currentIndex +1);
        changeSelectedSong(currentIndex + 1);
        prepareSong(next);
        MainActivity.setsongText(next);
    }else{

        SongInfoModel next1  = ArtistSongAlbumSongList.get(0);
        changeSelectedSong(0);
        prepareSong(ArtistSongAlbumSongList.get(0));
        MainActivity.setsongText(next1);
    }

}

您需要遵循以下步骤

1) 在此处创建用于播放音频和创建媒体播放器实例的服务 2) 在活动中绑定它(它可以是您的基本活动)
3) 在“活动”中使用“服务重新引用”获取媒体播放器实例并完成。从所有片段的活动中使用此实例

我不打算使用服务tbh。那么糟糕吗?你能告诉我另一个比服务更简单的解决方案吗?是的,也可以不用服务。在基本活动中创建媒体播放器实例。您将能够在fragment中的所有活动中访问该实例,并且我为media player创建了一个singleton类。代码张贴在上面。但问题是我在所有活动和片段中都实现了setOnCompletionListeners(),但只有最新实现的setOnCompletionListener()可以工作。我不知道为什么要在基类中执行相同的操作,并提供对(使用重写方法)子类的回调。然后,您将能够获得所需内容(wnt:),但如果我在基类中实现setOnCompletionListeners(),我将如何向其传递arrayList、object和所有其他内容?
public class MyMediaPlayer extends MediaPlayer  {

private static MyMediaPlayer mpclass ;




private MyMediaPlayer() {

}

public static MyMediaPlayer getInstance() {
    if (mpclass == null) {
        synchronized (MyMediaPlayer.class) {
            if (mpclass == null) {
                mpclass = new MyMediaPlayer();
            }
        }
    }

    return mpclass;
}