You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让我的Android音乐服务播放其他专辑的歌曲?

Android音乐应用专辑相关实现分享

我开发了一款Android音乐应用,包含多个Fragment,其中一个Fragment负责获取并展示设备中的所有专辑列表,实现代码如下:

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); //获取专辑ID列 
        int album_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM); //获取专辑名列 
        int artist_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST); //获取专辑艺术家列 
        int tracks_Column = myCursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.NUMBER_OF_SONGS); //获取专辑内歌曲数量列 
        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(); 
    } 
}

当用户点击专辑列表中的某一项时,我会将点击位置传递到专门展示专辑歌曲的AlbumActivity,点击事件的实现代码如下:

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用于展示对应专辑下的所有歌曲,还包含歌曲播放、专辑封面加载等功能,相关代码如下:

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); 
    // 加载专辑列表及专辑内歌曲 
    getAlbums(); 
    getSongsFromAlbum(); 
    /* //歌曲排序无效! 
    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(); 
            //获取当前歌曲详情 
            tvCurrSongTitle.setText(songList.get(songIndex).getTitle()); 
            tvCurrSongArtist.setText(songList.get(songIndex).getArtist()); 
            //获取当前播放歌曲的专辑封面 
            loadAlbumArtBottom(); 
        } 
    })); 
} 

private void playAudio(int songIndex) { 
    //检查服务是否活跃 
    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 { 
        //在SharedPreferences中存储新的歌曲索引 
        StorageUtil storageUtil = new StorageUtil(getApplicationContext()); 
        storageUtil.storeSongIndex(songIndex); 
        //服务已活跃 
        //通过广播接收器发送媒体指令 
        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); 
}

内容的提问来源于stack exchange,提问作者Vince VD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:56