簡體   English   中英

如何讓我的服務播放另一張專輯中的歌曲?

[英]How to let my service play songs from another album?

我有幾個片段,其中一個顯示了使用此代碼得到的所有專輯的列表:

private void getAlbums() {
    final Uri songUri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
    Cursor myCursor = getActivity().getContentResolver().query(songUri,  null, null, null, null);

    if (myCursor != null && myCursor.moveToFirst()) {
        int id_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID);    //Get column ALBUM ID
        int album_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM); //Get column ALBUM NAME
        int artist_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST); //Get column ALBUM ARTIST
        int tracks_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS); //Get column NUMBER OF SONGS IN ALBUM

        String temp = myCursor.getString(album_Column);


        do {

            Long albumId = myCursor.getLong(id_Column);
            String album = myCursor.getString(album_Column);
            String albumArtist = myCursor.getString(artist_Column);
            int tracks = myCursor.getInt(tracks_Column);

            if (!temp.equals(album)) {

                QueryAlbums queryAlbums = new QueryAlbums(albumId, album, albumArtist, tracks);
                albumList.add(queryAlbums);
            }
            temp = album;

        } while (myCursor.moveToNext());
        myCursor.close();
    }

當用戶單擊專輯時,我會將用戶單擊的位置傳遞到另一個活動。 這是用戶單擊相冊時的代碼:

recyclerViewAlbums.addOnItemTouchListener(new OnItemClickListeners(getContext(), new OnItemClickListeners.OnItemClickListener() {
        @TargetApi(Build.VERSION_CODES.O)
        @Override
        public void onItemClick(View view, int position) {
            albumIndex = position;
            Toast.makeText(getContext(), "You Clicked position: " + albumIndex + " " +  albumList.get(albumIndex).getAlbumName() + " "
                    + albumList.get(position).getAlbumid(), Toast.LENGTH_SHORT).show();
           Intent selectedAlbum = new Intent(getContext(), AlbumActivity.class);
            selectedAlbum.putExtra("albumIndex", albumIndex);
            startActivity(selectedAlbum);
        }
    }));

當用戶單擊顯示該專輯中歌曲的專輯時,將顯示此活動。

AlbumActivity.java

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

    recyclerViewAlbum = findViewById(R.id.recyclerViewAlbum);

    //AlbumAdapter
    songAdapter = new SongAdapter(getApplicationContext(), songList);
    songAdapter.notifyDataSetChanged();

    if (recyclerViewAlbum != null){
        recyclerViewAlbum.setHasFixedSize(true);
    }
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());

    recyclerViewAlbum.setAdapter(songAdapter);
    recyclerViewAlbum.setLayoutManager(linearLayoutManager);

    // Load album list and songs inside albums
    getAlbums();

    getSongsFromAlbum();

/*    //Sort songs  NOT WORKING!
    Collections.sort(songList, new Comparator<QuerySongs>() {
        public int compare(QuerySongs a, QuerySongs b) {
            return a.getTitle().compareTo(b.getTitle());
        }
    });  */

    albumIvBottom = findViewById(R.id.albumIvBottom);
    tvCurrSongTitle = findViewById(R.id.tvCurrSongTitle);
    tvCurrSongArtist = findViewById(R.id.tvCurrSongArtist);

    recyclerViewAlbum.addOnItemTouchListener(new OnItemClickListeners(getApplicationContext(), new OnItemClickListeners.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            songIndex = position;
            playAudio(songIndex);
            Toast.makeText(getApplicationContext(), "You Clicked position: " + songIndex + " " +  songList.get(songIndex).getData(), Toast.LENGTH_SHORT).show();

            //Fetch current song details
            tvCurrSongTitle.setText(songList.get(songIndex).getTitle());
            tvCurrSongArtist.setText(songList.get(songIndex).getArtist());

            //Fetch album art activeSong
            loadAlbumArtBottom();

        }
    }));

}

private void playAudio(int songIndex) {
    //Check if service is active
    if (!serviceBound) {
        StorageUtil storageUtil = new StorageUtil(getApplicationContext());
        storageUtil.storeSong(songList);
        storageUtil.storeSongIndex(songIndex);

        Intent playerIntent = new Intent(getApplicationContext(), MediaPlayerService.class);
        startService(playerIntent);
        bindService(playerIntent, serviceConnection, Context.BIND_AUTO_CREATE);
    } else {
        //Store new songIndex in mSharedPreferences
        StorageUtil storageUtil = new StorageUtil(getApplicationContext());
        storageUtil.storeSongIndex(songIndex);

        //Service is active
        //Send media with BroadcastReceiver
        Intent broadCastReceiverIntent = new Intent(broadCast_PlAY_NEW_SONG);
        sendBroadcast(broadCastReceiverIntent);
    }

}

private void loadAlbumArtBottom(){
    Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
    Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, songList.get(songIndex).getAlbumId());
    Picasso.with(getApplicationContext())
            .load(albumArtUri)
            .placeholder(R.drawable.no_album)
            .error(R.drawable.no_album)
            .resize(220, 220)
            .centerCrop()
            .into(albumIvBottom);
}


//Store album info in ArrayList
@TargetApi(Build.VERSION_CODES.O)
private void getAlbums() {
    final Uri songUri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
    Cursor myCursor = getContentResolver().query(songUri,  null, null, null, null);

    if (myCursor != null && myCursor.moveToFirst()) {
        int id_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums._ID);    //Get column ALBUM ID
        int album_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM); //Get column ALBUM NAME
        int artist_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST); //Get column ALBUM ARTIST
        int tracks_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS); //Get column NUMBER OF SONGS IN ALBUM

        String temp = myCursor.getString(album_Column);


        do {

            Long albumId = myCursor.getLong(id_Column);
            String album = myCursor.getString(album_Column);
            String albumArtist = myCursor.getString(artist_Column);
            int tracks = myCursor.getInt(tracks_Column);

            if (!temp.equals(album)) {

                QueryAlbums queryAlbums = new QueryAlbums(albumId, album, albumArtist, tracks);
                albumList.add(queryAlbums);
            }
            temp = album;

        } while (myCursor.moveToNext());
        myCursor.close();
    }

}

private void getSongsFromAlbum() {
    final Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    bundle = getIntent().getExtras();
    int albumIndex = bundle.getInt("albumIndex");

    String selection = MediaStore.Audio.Media.ALBUM + "=?";
    String songsInAlbum[] = { albumList.get(albumIndex).getAlbumName() };
    Cursor myCursor = getContentResolver().query(songUri, null, selection, songsInAlbum, null);


    if (myCursor != null && myCursor.moveToFirst()) {
        int id_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID);
        int albumId_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID);
        int album_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM);
        int data_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
        int title_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE);
        int artist_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);

        do {

            Long songId = myCursor.getLong(id_Column);
            Long albumId = myCursor.getLong(albumId_Column);
            String album = myCursor.getString(album_Column);
            String songData = myCursor.getString(data_Column);
            String songName = myCursor.getString(title_Column);
            String songArtist = myCursor.getString(artist_Column);

            QuerySongs querySongs = new QuerySongs(songId, albumId, album, songData, songName, songArtist);
            songList.add(querySongs);

        } while (myCursor.moveToNext());
        myCursor.close();
    }

}

因此,問題在於,當我播放一首歌曲,然后單擊“后退”按鈕返回到我的專輯頁面(片段標簽),然后單擊另一張專輯並播放該歌曲時,它仍會播放我之前選擇的歌曲。

任何想法我造成問題的? 我試圖在按下后退按鈕時清除arraylists,但這沒有用。

提前致謝,

文斯

  • 在子線程上查詢數據庫
  • 訂購可能需要自定義規則。
  • 播放音樂的代碼在哪里?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM