如何让我的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
相关产品推荐
相关产品推荐

