From 72bf148ad57262950e1b253fc4cef14636ed81b0 Mon Sep 17 00:00:00 2001 From: litingting Date: Mon, 30 Sep 2024 16:45:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=88=97=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 1 - .../music/player/adapter/AdapterPlayList.java | 49 ++++- .../player/customerview/AnimaPlayingView.java | 158 ++++++++++++++ .../hi/music/player/helper/CommonUtils.java | 92 +++++--- .../com/hi/music/player/helper/MyValue.java | 2 + .../media3/DynamicMediaSourceFactory.java | 169 +++++++++++++++ .../media3/MyMediaControllerManager.java | 199 ++++++++++-------- .../music/player/media3/PlaybackService.java | 82 ++++++-- .../player/media3/testSourceFactory.java | 73 +++++++ .../hi/music/player/network/JsonHelper.java | 1 - .../music/player/network/ObserverWrapper.java | 6 +- .../player/ui/activity/PlayActivity.java | 129 +++++++----- .../player/ui/activity/viewmodel/VMPlay.java | 7 +- app/src/main/res/layout/activity_play.xml | 23 +- app/src/main/res/layout/dialog_play_list.xml | 9 +- app/src/main/res/layout/item_play_list.xml | 35 ++- app/src/main/res/values/colors.xml | 1 + 17 files changed, 801 insertions(+), 235 deletions(-) create mode 100644 app/src/main/java/com/hi/music/player/customerview/AnimaPlayingView.java create mode 100644 app/src/main/java/com/hi/music/player/media3/DynamicMediaSourceFactory.java create mode 100644 app/src/main/java/com/hi/music/player/media3/testSourceFactory.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd79058..25c11bc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,6 @@ - { + + private String mCurVideId; + + private String lastVideId; + + private int curMusicPos = 0; + private MyMediaControllerManager instance = MyMediaControllerManager.getInstance(); + @Override protected ItemPlayListBinding getViewBinding(ViewGroup parent) { return ItemPlayListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); } + public void setCurVideId(String curVideId) { + lastVideId = mCurVideId; + this.mCurVideId = curVideId; + for (int i = 0; i < data.size(); i++) { + ResponsePlayListInfo listInfo = data.get(i); + if (listInfo.getVideoId().equals(curVideId)) { + notifyItemChanged(i); + } + if (listInfo.getVideoId().equals(lastVideId)) { + notifyItemChanged(i); + } + } + } + + public void updateCurMusicAnimation(){ + notifyItemChanged(curMusicPos); + } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { @@ -40,20 +65,32 @@ public class AdapterPlayList extends BaseAdapter 0) { @@ -75,7 +79,6 @@ public class CommonUtils { } - //time 3:45 public static long convertToMilliseconds(String time) { String[] parts = time.split(":"); @@ -92,37 +95,42 @@ public class CommonUtils { return String.format("%d:%02d", minutes, seconds); // 格式化为 mm:ss } + public static int getMyColor(int resId) { + return MusicApplication.myApplication.getColor(resId); + } + // 使用 Palette 提取深色主色调 public static void getDominantDarkColor1(Drawable imDraw, onImageColorListener listener) { // 异步生成 Palette - BitmapDrawable drawable = (BitmapDrawable)imDraw; - if(drawable!=null){ + BitmapDrawable drawable = (BitmapDrawable) imDraw; + if (drawable != null) { Bitmap bitmap = drawable.getBitmap(); - Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() { - @Override - public void onGenerated(Palette palette) { - // 首先尝试获取深色活力色 - Palette.Swatch darkVibrantSwatch = palette.getDarkVibrantSwatch(); + Palette.from(bitmap) + .generate(new Palette.PaletteAsyncListener() { + @Override + public void onGenerated(Palette palette) { + // 首先尝试获取深色活力色 + Palette.Swatch darkVibrantSwatch = palette.getDarkVibrantSwatch(); - // 如果没有深色活力色,尝试获取深色柔和色 - if (darkVibrantSwatch == null) { - darkVibrantSwatch = palette.getDarkMutedSwatch(); - } + // 如果没有深色活力色,尝试获取深色柔和色 + if (darkVibrantSwatch == null) { + darkVibrantSwatch = palette.getDarkMutedSwatch(); + } - // 如果存在深色样本,则获取其 RGB 颜色值 - if (darkVibrantSwatch != null) { - int dominantDarkColor = darkVibrantSwatch.getRgb(); - listener.onImageColor(dominantDarkColor); - String dominantColorHex = String.format("#%06X", (0xFFFFFF & dominantDarkColor)); - Log.d("Dominant Dark Color", "主色调: " + dominantColorHex); // 打印主色调 - } else { - Log.d("Dominant Dark Color", "未找到深色主色调"); - listener.onImageColor(-1); - } - } - }); - }else { + // 如果存在深色样本,则获取其 RGB 颜色值 + if (darkVibrantSwatch != null) { + int dominantDarkColor = darkVibrantSwatch.getRgb(); + listener.onImageColor(dominantDarkColor); + String dominantColorHex = String.format("#%06X", (0xFFFFFF & dominantDarkColor)); + Log.d("Dominant Dark Color", "主色调: " + dominantColorHex); // 打印主色调 + } else { + Log.d("Dominant Dark Color", "未找到深色主色调"); + listener.onImageColor(-1); + } + } + }); + } else { listener.onImageColor(-1); } @@ -142,7 +150,7 @@ public class CommonUtils { } - public static Drawable getNewDrawable(int color,float RadiusTopLeft,float RadiusTopRight,float RadiusBottomRight,float RadiusBottomLeft){ + public static Drawable getNewDrawable(int color, float RadiusTopLeft, float RadiusTopRight, float RadiusBottomRight, float RadiusBottomLeft) { // 创建 GradientDrawable GradientDrawable drawable = new GradientDrawable(); @@ -162,4 +170,34 @@ public class CommonUtils { drawable.setCornerRadii(radii); return drawable; } + + + /** + * 当前媒体项是否有有效的播放地址 + * @param mediaItem + * @return + */ + public static boolean hasValidUri(MediaItem mediaItem) { + MediaItem.LocalConfiguration localConfiguration = mediaItem.localConfiguration; + if(localConfiguration != null){ + if(CommonUtils.isUriFormat(localConfiguration.uri)){ + return true; + } + } + return false; + } + + private static boolean isUriFormat(Uri parsedUri) { + // 3. 检查 URI 是否具有正确的格式 + try { + if (parsedUri.getScheme() == null) { + LogMsg( "URI has no valid scheme."); + return false; + } + } catch (Exception e) { + LogMsg( "URI parsing failed: " + e.getMessage()); + return false; + } + return true; + } } diff --git a/app/src/main/java/com/hi/music/player/helper/MyValue.java b/app/src/main/java/com/hi/music/player/helper/MyValue.java index 4a3360e..10bffc0 100644 --- a/app/src/main/java/com/hi/music/player/helper/MyValue.java +++ b/app/src/main/java/com/hi/music/player/helper/MyValue.java @@ -13,5 +13,7 @@ public class MyValue { //暂停或者停止 public final static int PLAY_STATUS_CODE_PAUSE = -3; + + //-----------------------------PlayActivity } diff --git a/app/src/main/java/com/hi/music/player/media3/DynamicMediaSourceFactory.java b/app/src/main/java/com/hi/music/player/media3/DynamicMediaSourceFactory.java new file mode 100644 index 0000000..38eac36 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/media3/DynamicMediaSourceFactory.java @@ -0,0 +1,169 @@ +package com.hi.music.player.media3; + +import android.net.Uri; + +import androidx.media3.common.MediaItem; +import androidx.media3.common.util.UnstableApi; +import androidx.media3.datasource.DataSource; +import androidx.media3.datasource.DataSpec; +import androidx.media3.datasource.ResolvingDataSource; +import androidx.media3.datasource.cache.CacheDataSource; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.exoplayer.drm.DrmSessionManagerProvider; +import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; +import androidx.media3.exoplayer.source.MediaSource; +import androidx.media3.exoplayer.source.MediaSourceFactory; +import androidx.media3.exoplayer.source.ProgressiveMediaSource; +import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; + +import com.hi.music.player.api.RequestListener; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.javabean.response.ResponsePlayUrl; +import com.hi.music.player.network.JsonHelper; +import com.hi.music.player.network.RetrofitManager; + +import org.json.JSONObject; + +import java.io.IOException; + +import okhttp3.ResponseBody; + + +public class DynamicMediaSourceFactory implements MediaSource.Factory { + // private final CacheDataSource.Factory cacheDataSourceFactory; +// private final ExoPlayer player; + private DefaultMediaSourceFactory mediaSourceFactory; + + // public DynamicMediaSourceFactory(DefaultMediaSourceFactory factory,CacheDataSource.Factory cacheDataSourceFactory, ExoPlayer exoPlayer) { +// this.cacheDataSourceFactory = cacheDataSourceFactory; +// this.player = exoPlayer; +// this.mediaSourceFactory = factory; +// } + public DynamicMediaSourceFactory(DefaultMediaSourceFactory factory) { + + this.mediaSourceFactory = factory; + } + + + @UnstableApi + @Override + public MediaSource.Factory setDrmSessionManagerProvider(DrmSessionManagerProvider drmSessionManagerProvider) { + return null; + } + + @UnstableApi + @Override + public MediaSource.Factory setLoadErrorHandlingPolicy(LoadErrorHandlingPolicy loadErrorHandlingPolicy) { + return null; + } + + @UnstableApi + @Override + public int[] getSupportedTypes() { + return new int[0]; + } + + @UnstableApi + @Override + public MediaSource createMediaSource(MediaItem mediaItem) { + + + CommonUtils.LogMsg("------createMediaSource----------=" + mediaItem.mediaId + "---------" + mediaItem.mediaMetadata.title); +// MediaSource realMediaSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory) +// .createMediaSource(MediaItem.fromUri("")); +// RetrofitManager.getInstance().getPlayUrl(mediaItem.mediaId, new RequestListener() { +// +// @Override +// public void onFail(String errorMsg) { +// +// } +// +// @Override +// public void onSuccess(ResponseBody data) { +// JSONObject jsonObject = CommonUtils.toJsonObject(data); +// if (jsonObject != null) { +// ResponsePlayUrl responsePlayUrl = JsonHelper.ResolvePlayUrlJson(jsonObject); +// if (responsePlayUrl == null) { +// // TODO: 2024/9/27 +// return; +// } +// String uri = ""; +// if (responsePlayUrl.getAudioUrlMedium() != null) { +// uri = responsePlayUrl.getAudioUrlMedium(); +// } else { +// uri = responsePlayUrl.getAudioUrlLow(); +// } +// CommonUtils.LogMsg("------createMediaSource----------="+mediaItem.mediaId+"---------"+uri); +// ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory) +// .createMediaSource(MediaItem.fromUri(uri)); +// player.setMediaSource(mediaSource); +// player.prepare(); +// +// } +// +// +// } +// }); + +// return new ProgressiveMediaSource.Factory(cacheDataSourceFactory) +// .createMediaSource(MediaItem.fromUri(responsePlayUrl.getAudioUrlMedium())); + // 可以在这里根据 mediaItem 的 ID 动态生成新的 URI + String updatedUri = "https://rr1---sn-tt1e7nlz.googlevideo.com/videoplayback?expire=1727628605&ei=3TD5ZuWFEe-yzN0P27WuqQ4&ip=146.19.167.8&id=o-ANGM0PjEvsfYH7TmYV_DFuD-65tipJeeLe2URDOk90sL&itag=140&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&mh=xj&mm=31%2C29&mn=sn-tt1e7nlz%2Csn-vgqsknsk&ms=au%2Crdu&mv=m&mvi=1&pl=24&pcm2=no&gcr=us&initcwndbps=7610000&vprv=1&svpuc=1&mime=audio%2Fmp4&rqh=1&gir=yes&clen=5440168&dur=335.973&lmt=1709326903801285&mt=1727606690&fvip=5&keepalive=yes&fexp=51299152&c=ANDROID_MUSIC&txp=2318224&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cpcm2%2Cgcr%2Cvprv%2Csvpuc%2Cmime%2Crqh%2Cgir%2Cclen%2Cdur%2Clmt&sig=AJfQdSswRQIhALmM_S8Cmagr60muB3wDOby0OdcjF-x6f7TcEenixH0KAiAnR0-hmA03MeVzSg2wi5ncJ4Ve5FFlpZnlSoRNGWgGhQ%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=ABPmVW0wRQIhAPv5slfEnf8_E7o6yjEkussQ6JIFFaSY6QtP9HXncTTcAiAjlhMa71t76Wu1R1rcmsHoO6pyxjhGYouio4D0deJqEA%3D%3D"; + Uri updateUri = null; + + MediaItem.Builder builder = mediaItem.buildUpon(); + if (mediaItem.localConfiguration != null) { + updateUri = mediaItem.localConfiguration.uri; + builder.setUri(updateUri); + CommonUtils.LogErrorMsg("----updateUri=成功 builder="+mediaItem.mediaId+"--updateUri="+updateUri); + }else { + CommonUtils.LogErrorMsg("----updateUri=null builder="+mediaItem.mediaId); + } + + return mediaSourceFactory.createMediaSource(builder.build()); + + } + +// @UnstableApi +// @Override +// public DataSource createDataSource() { +// +// +// +// +//// RetrofitManager.getInstance().getPlayUrl(mediaItem.mediaId, new RequestListener() { +//// +//// @Override +//// public void onFail(String errorMsg) { +//// +//// } +//// +//// @Override +//// public void onSuccess(ResponseBody data) { +//// JSONObject jsonObject = CommonUtils.toJsonObject(data); +//// if (jsonObject != null) { +//// ResponsePlayUrl responsePlayUrl = JsonHelper.ResolvePlayUrlJson(jsonObject); +//// if (responsePlayUrl == null) { +//// // TODO: 2024/9/27 +//// return; +//// } +//// String uri = ""; +//// if (responsePlayUrl.getAudioUrlMedium() != null) { +//// uri = responsePlayUrl.getAudioUrlMedium(); +//// } else { +//// uri = responsePlayUrl.getAudioUrlLow(); +//// } +//// CommonUtils.LogMsg("------createMediaSource----------="+mediaItem.mediaId+"---------"+uri); +//// ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory) +//// .createMediaSource(MediaItem.fromUri(uri)); +//// player.setMediaSource(mediaSource); +//// player.prepare(); +//// +//// } +//// +//// +//// } +//// }); +// return null; +// } +} diff --git a/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java b/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java index 8225419..c4158de 100644 --- a/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java +++ b/app/src/main/java/com/hi/music/player/media3/MyMediaControllerManager.java @@ -24,6 +24,7 @@ import com.hi.music.player.javabean.response.ResponsePlayListInfo; import com.hi.music.player.javabean.response.ResponsePlayUrl; import com.hi.music.player.network.RetrofitManager; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; @@ -61,7 +62,6 @@ public class MyMediaControllerManager { // playerView.setPlayer(controllerFuture.get()); try { mediaController = controllerFuture.get(); - statusListener.onMediaControllerComplete(true); CommonUtils.LogMsg("=-----mediaController+" + mediaController); } catch (ExecutionException | InterruptedException e) { @@ -85,7 +85,7 @@ public class MyMediaControllerManager { @Override public void onMediaItemTransition(@Nullable MediaItem mediaItem, int reason) { //当前媒体项发生变化,切歌 - if(mediaItem == null){ + if (mediaItem == null) { //第二次进入PlayActitivity ,调用resetPlayList(),这里为null return; } @@ -98,19 +98,16 @@ public class MyMediaControllerManager { if (isPlaying) { mListener.onPlayStatus(MyValue.PLAY_STATUS_CODE_PLAYING); // TODO: 2024/9/26 自动播放完成切歌到下一首播放没有触发这里请求下一首 - // 播放器开始播放 - MediaItem currentItem = mediaController.getCurrentMediaItem(); - int currentMediaItemIndex = mediaController.getCurrentMediaItemIndex(); - if (currentMediaItemIndex < playList.size() - 1) { - //代表有下一首 - if (!mediaController.hasNextMediaItem()) { - //没有更新下一首的uri + if (mediaController.hasNextMediaItem()) { + MediaItem mediaItemAt = mediaController.getMediaItemAt(mediaController.getNextMediaItemIndex()); + if (!CommonUtils.hasValidUri(mediaItemAt)) { CommonUtils.LogMsg("----0000000000-请求下一首的uri" + mediaController.getMediaItemCount()); - int nextIndex = currentMediaItemIndex + 1; - mListener.onRequestNextUri(playList.get(nextIndex).getVideoId(), nextIndex,false); - + int nextIndex = mediaController.getNextMediaItemIndex(); + mListener.onRequestNextUri(mediaController.getMediaItemAt(nextIndex).mediaId, nextIndex, false); } + } + } else { // 播放器暂停或停止 mListener.onPlayStatus(MyValue.PLAY_STATUS_CODE_PAUSE); @@ -119,7 +116,6 @@ public class MyMediaControllerManager { @Override public void onPlaybackStateChanged(int playbackState) { - CommonUtils.LogMsg("----playbackState" + playbackState + "------------" + mediaController.getMediaItemCount()); mListener.onPlayStatus(playbackState); } @@ -149,56 +145,54 @@ public class MyMediaControllerManager { } -// /** + // /** // * 更新播放列表中的音频url // * // * @param playUrl // */ -// public void UpdateAudioUrl(ResponsePlayUrl playUrl) { -// -// CommonUtils.LogMsg("-------------更新播放列表中的音频 mediaController.getMediaItemCount()=" + mediaController.getMediaItemCount()); -// for (int i = 0; i < mediaController.getMediaItemCount(); i++) { -// MediaItem mediaItemAt = mediaController.getMediaItemAt(i); -// if (mediaItemAt.mediaId.equals(playUrl.getVideoId())) { -// -// MediaItem.Builder builder = mediaItemAt.buildUpon(); -//// mediaController.removeMediaItem(i); -//// MediaItem.Builder builder = new MediaItem.Builder(); -// builder.setMediaId(playUrl.getVideoId()); -// if (playUrl.getAudioUrlMedium() != null) { -// builder.setUri(playUrl.getAudioUrlMedium()); -// } else { -// builder.setUri(playUrl.getAudioUrlLow()); -// } -// mediaController.replaceMediaItem(i, builder.build()); -// CharSequence title = mediaController.getMediaItemAt(i).mediaMetadata.title; -// CommonUtils.LogMsg("-------------更新播放列表中的音频url= i=" + i + "---title=" + title + "----mediaController.size=" + mediaController.getMediaItemCount() + "---" + mediaController); -// break; -// } -// } -// } + public void UpdateAudioUrl(ResponsePlayUrl playUrl, int index) { + CommonUtils.LogMsg("-------------更新播放列表中的音频url= index=" + index); + for (int i = 0; i < mediaController.getMediaItemCount(); i++) { + MediaItem mediaItemAt = mediaController.getMediaItemAt(i); + if (mediaItemAt.mediaId.equals(playUrl.getVideoId())) { + + MediaItem.Builder builder = mediaItemAt.buildUpon(); + builder.setMediaId(playUrl.getVideoId()); + if (playUrl.getAudioUrlMedium() != null) { + builder.setUri(playUrl.getAudioUrlMedium()); + } else { + builder.setUri(playUrl.getAudioUrlLow()); + } + CharSequence title = mediaController.getMediaItemAt(i).mediaMetadata.title; + CommonUtils.LogMsg("-------------更新播放列表中的音频url= i=" + i + "---id=" + playUrl.getVideoId() + "----mediaController.size=" + mediaController.getMediaItemCount()); + mediaController.replaceMediaItem(i, builder.build()); + break; + } + } + } public void setPlayList(List playList) { this.playList = playList; + addMusicPlayList(playList); } public List getPlayList() { return playList; } - public void resetPlayList(){ + public void resetPlayList() { mediaController.clearMediaItems(); } /** * 添加播放列表(不带音频url) - * 注意没有更新有效uri的不会被实际添加到mediaController + * 注意没有setUri的不会被实际添加到mediaController, * * @param playUrl */ @OptIn(markerClass = UnstableApi.class) public void addMusicToPlayList(ResponsePlayUrl playUrl, int playListIndex) { - if (playListIndex < playList.size()&& playListIndex>=mediaController.getMediaItemCount()) { + if (playListIndex < playList.size() && playListIndex >= mediaController.getMediaItemCount()) { ResponsePlayListInfo listInfo = playList.get(playListIndex); if (listInfo.getVideoId().equals(playUrl.getVideoId())) { MediaItem.Builder builder = new MediaItem.Builder(); @@ -214,7 +208,6 @@ public class MyMediaControllerManager { MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder(); MediaMetadata_builder.setArtist(listInfo.getSingerName()); - /** * 这里使用setDescription保存歌曲时长的分秒字符串 */ @@ -228,49 +221,53 @@ public class MyMediaControllerManager { // MediaMetadata_builder.setRecordingYear(Integer.parseInt(playInfo.getYear())); builder.setMediaMetadata(MediaMetadata_builder.build()); mediaController.addMediaItem(builder.build()); + } } } -// /** -// * 添加播放列表(不带音频url) -// * 注意没有更新有效uri的不会被实际添加到mediaController -// * -// * @param listInfo -// */ -// @OptIn(markerClass = UnstableApi.class) -// public void addMusicPlayList(List listInfo) { -// playList = listInfo; -// List mediaItems = new ArrayList<>(); -// for (int i = 0; i < listInfo.size(); i++) { -// ResponsePlayListInfo playInfo = listInfo.get(i); -// -// MediaItem.Builder builder = new MediaItem.Builder(); -// -// //唯一标识符 -// builder.setMediaId(playInfo.getVideoId()); -// -// MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder(); -// -// MediaMetadata_builder.setArtist(playInfo.getSingerName()); -// MediaMetadata_builder.setDurationMs(playInfo.getDurationMs()); -//// MediaMetadata_builder.setArtworkUri(Uri.parse(playInfo.getCovert())); -// MediaMetadata_builder.setArtworkUri(Uri.parse("https://t7.baidu.com/it/u=2604797219,1573897854&fm=193&f=GIF")); -// MediaMetadata_builder.setTitle(playInfo.getSongTitle()); -// -// CommonUtils.LogMsg("----------添加播放列表 i=" + i + "---" + playInfo.getSongTitle() + "-------VideoId=" + playInfo.getVideoId()); -//// MediaMetadata_builder.setRecordingYear(Integer.parseInt(playInfo.getYear())); -// builder.setMediaMetadata(MediaMetadata_builder.build()); -// mediaController.addMediaItem(builder.build()); -//// mediaItems.add(builder.build()); -// } -//// mediaController.setMediaItems(mediaItems); -// } + /** + * 添加播放列表(不带音频url) + * 注意没有setUri的不会被实际添加到mediaController(mediaController.getMediaItemCount()) + * 这里setUri 一个占位 + * + * @param listInfo + */ + @OptIn(markerClass = UnstableApi.class) + public void addMusicPlayList(List listInfo) { + playList = listInfo; + List mediaItems = new ArrayList<>(); + for (int i = 0; i < listInfo.size(); i++) { + ResponsePlayListInfo playInfo = listInfo.get(i); + + MediaItem.Builder builder = new MediaItem.Builder(); + + //唯一标识符 + builder.setMediaId(playInfo.getVideoId()); + builder.setUri("-------test-----"); + MediaMetadata.Builder MediaMetadata_builder = new MediaMetadata.Builder(); + + MediaMetadata_builder.setArtist(playInfo.getSingerName()); + MediaMetadata_builder.setDescription(playInfo.getDuration()); + MediaMetadata_builder.setDurationMs(playInfo.getDurationMs()); + MediaMetadata_builder.setArtworkUri(Uri.parse(playInfo.getCovert())); + MediaMetadata_builder.setTitle(playInfo.getSongTitle()); + + CommonUtils.LogMsg("----------添加播放列表 i=" + i + "---" + playInfo.getSongTitle() + "-------VideoId=" + playInfo.getVideoId()); +// MediaMetadata_builder.setRecordingYear(Integer.parseInt(playInfo.getYear())); + builder.setMediaMetadata(MediaMetadata_builder.build()); + mediaController.addMediaItem(builder.build()); + + } + + } public void play() { if (!mediaController.isPlaying()) { + CommonUtils.LogMsg("-----------prepare"); mediaController.prepare(); mediaController.play(); + } } @@ -279,21 +276,32 @@ public class MyMediaControllerManager { if (mediaController.isPlaying()) mediaController.pause(); } + public void stop() { if (mediaController.isPlaying()) mediaController.stop(); } + public void playNext() { if (mediaController.hasNextMediaItem()) { - mediaController.seekToNextMediaItem(); - } else { - int currentMediaItemIndex = mediaController.getCurrentMediaItemIndex(); - if (currentMediaItemIndex < playList.size() - 1) { - //应该有下一首,可能是歌曲url请求失败,需要重新请求 - int nextIndex = currentMediaItemIndex + 1; - mListener.onRequestNextUri(playList.get(nextIndex).getVideoId(), nextIndex,true); - CommonUtils.LogMsg("-------------应该有下一首,可能是歌曲url请求失败,需要重新请求"); + int nextMediaItemIndex = mediaController.getNextMediaItemIndex(); + MediaItem mediaItemAt = mediaController.getMediaItemAt(nextMediaItemIndex); + boolean b = CommonUtils.hasValidUri(mediaItemAt); + if (b) { + mediaController.seekToNextMediaItem(); + return; } + CommonUtils.LogMsg("-------------有下一首,但是歌曲url请求失败,需要重新请求"); + mListener.onRequestNextUri(mediaController.getMediaItemAt(nextMediaItemIndex).mediaId, nextMediaItemIndex, true); + + } else { +// int currentMediaItemIndex = mediaController.getCurrentMediaItemIndex(); +// if (currentMediaItemIndex < playList.size() - 1) { +// //应该有下一首,可能是歌曲url请求失败,需要重新请求 +// int nextIndex = currentMediaItemIndex + 1; +// mListener.onRequestNextUri(playList.get(nextIndex).getVideoId(), nextIndex, true); +// CommonUtils.LogMsg("-------------应该有下一首,可能是歌曲url请求失败,需要重新请求"); +// } } } @@ -305,4 +313,29 @@ public class MyMediaControllerManager { mediaController.play(); } } + + + /** + * 播放指定播放列表位置的歌曲 + * + * @param index + */ + public void playPositionMusic(int index) { + if (index >= mediaController.getMediaItemCount()) { + CommonUtils.LogErrorMsg("-------------数组越界"); + return; + } + + stop(); + mediaController.prepare(); + mediaController.seekTo(index); + + MediaItem mediaItemAt = mediaController.getMediaItemAt(index); + boolean b = CommonUtils.hasValidUri(mediaItemAt); + if (!b) { + CommonUtils.LogMsg("-------------播放指定播放列表位置的歌曲,需要重新请求"); + mListener.onRequestNextUri(mediaItemAt.mediaId, index, true); + } + + } } diff --git a/app/src/main/java/com/hi/music/player/media3/PlaybackService.java b/app/src/main/java/com/hi/music/player/media3/PlaybackService.java index 6ebcf2c..5511551 100644 --- a/app/src/main/java/com/hi/music/player/media3/PlaybackService.java +++ b/app/src/main/java/com/hi/music/player/media3/PlaybackService.java @@ -5,48 +5,59 @@ import android.content.Intent; import androidx.annotation.Nullable; import androidx.annotation.OptIn; -import androidx.media3.common.AudioAttributes; -import androidx.media3.common.C; -import androidx.media3.common.MediaItem; -import androidx.media3.common.MediaMetadata; import androidx.media3.common.Player; import androidx.media3.common.util.UnstableApi; +import androidx.media3.database.StandaloneDatabaseProvider; +import androidx.media3.datasource.DataSource; +import androidx.media3.datasource.DataSpec; +import androidx.media3.datasource.DefaultDataSource; +import androidx.media3.datasource.DefaultHttpDataSource; +import androidx.media3.datasource.ResolvingDataSource; +import androidx.media3.datasource.cache.CacheDataSource; +import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor; +import androidx.media3.datasource.cache.SimpleCache; +import androidx.media3.exoplayer.DefaultLoadControl; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; -import androidx.media3.exoplayer.source.MediaSource; +import androidx.media3.extractor.ExtractorsFactory; +import androidx.media3.extractor.mkv.MatroskaExtractor; import androidx.media3.session.MediaSession; import androidx.media3.session.MediaSessionService; -import com.google.common.util.concurrent.ListenableFuture; -import com.hi.music.player.R; +import com.hi.music.player.MusicApplication; import com.hi.music.player.helper.CommonUtils; -import com.hi.music.player.javabean.response.ResponsePlayUrl; -import java.util.ArrayList; -import java.util.List; +import java.io.File; +import java.io.IOException; public class PlaybackService extends MediaSessionService { private MediaSession mediaSession = null; private ExoPlayer player; + @OptIn(markerClass = UnstableApi.class) @Override public void onCreate() { super.onCreate(); - player = new ExoPlayer.Builder(this).build(); + + DynamicMediaSourceFactory customMediaSourceFactory = new DynamicMediaSourceFactory(new DefaultMediaSourceFactory(new DefaultHttpDataSource.Factory())); + + DefaultMediaSourceFactory defaultMediaSourceFactory1 = new DefaultMediaSourceFactory(getUrlFactory()); + + + // 创建 DefaultLoadControl,配置缓冲参数 + DefaultLoadControl loadControl = new DefaultLoadControl.Builder() + .setBufferDurationsMs(10000, // minBufferMs: 播放前的最小缓冲时间(毫秒) + 60000, // maxBufferMs: 最大缓冲时间(毫秒) + 10000, // bufferForPlaybackMs: 播放时的目标缓冲时间(毫秒) + 5000) // bufferForPlaybackAfterRebufferMs: 重新缓冲后的缓冲时间(毫秒) + .build(); + player = new ExoPlayer.Builder(this) +// .setMediaSourceFactory(customMediaSourceFactory) +// .setLoadControl(loadControl) + .build(); mediaSession = new MediaSession.Builder(this, player) - .setCallback(new MediaSession.Callback() { - @Override - public ListenableFuture> onAddMediaItems(MediaSession mediaSession, MediaSession.ControllerInfo controller, List mediaItems) { - - CommonUtils.LogMsg("--------实际添加的媒体项="+mediaItems.size()+"----"+mediaSession.getPlayer().getMediaItemCount()); - return MediaSession.Callback.super.onAddMediaItems(mediaSession, controller, mediaItems); - } - - - - }) .build(); // player = new ExoPlayer.Builder(this) @@ -69,12 +80,39 @@ public class PlaybackService extends MediaSessionService { // .build(); + } + @OptIn(markerClass = UnstableApi.class) + private DataSource.Factory getUrlFactory() { + CommonUtils.LogMsg("--------getUrlFactory"); + return new ResolvingDataSource.Factory(getCacheDataSource(), new ResolvingDataSource.Resolver() { + @Override + public DataSpec resolveDataSpec(DataSpec dataSpec) { + CommonUtils.LogMsg("--------resolveDataSpec=" + dataSpec.key); + return null; + } + }); } + @OptIn(markerClass = UnstableApi.class) + private CacheDataSource.Factory getCacheDataSource() { + // 1. 创建缓存对象 + SimpleCache simpleCache = new SimpleCache( + new File(MusicApplication.myApplication.getCacheDir(), "media3_cache"), // 设置缓存目录 + new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024), // 设置最大缓存大小(例如 100MB) + new StandaloneDatabaseProvider(MusicApplication.myApplication)); + // 2. 创建 DataSource.Factory,用于加载媒体资源 + DataSource.Factory dataSourceFactory = new DefaultDataSource.Factory(MusicApplication.myApplication); + + // 3. 创建 CacheDataSource.Factory,包含缓存功能 + return new CacheDataSource.Factory() + .setCache(simpleCache) + .setUpstreamDataSourceFactory(dataSourceFactory) // 用于从网络加载的工厂 + .setCacheWriteDataSinkFactory(null); // 默认写入缓存 + } @Nullable @Override diff --git a/app/src/main/java/com/hi/music/player/media3/testSourceFactory.java b/app/src/main/java/com/hi/music/player/media3/testSourceFactory.java new file mode 100644 index 0000000..cbea816 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/media3/testSourceFactory.java @@ -0,0 +1,73 @@ +package com.hi.music.player.media3; + +import androidx.media3.common.MediaItem; +import androidx.media3.common.util.UnstableApi; +import androidx.media3.datasource.DataSource; +import androidx.media3.exoplayer.drm.DrmSessionManagerProvider; +import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; +import androidx.media3.exoplayer.source.MediaSource; +import androidx.media3.exoplayer.upstream.LoadErrorHandlingPolicy; + +import com.hi.music.player.helper.CommonUtils; + + +public class testSourceFactory implements DataSource.Factory { +// private final CacheDataSource.Factory cacheDataSourceFactory; +// private final ExoPlayer player; + private DefaultMediaSourceFactory mediaSourceFactory; + +// public DynamicMediaSourceFactory(DefaultMediaSourceFactory factory,CacheDataSource.Factory cacheDataSourceFactory, ExoPlayer exoPlayer) { +// this.cacheDataSourceFactory = cacheDataSourceFactory; +// this.player = exoPlayer; +// this.mediaSourceFactory = factory; +// } + public testSourceFactory(DefaultMediaSourceFactory factory) { + + this.mediaSourceFactory = factory; + } + + + + @UnstableApi + @Override + public DataSource createDataSource() { + + + + +// RetrofitManager.getInstance().getPlayUrl(mediaItem.mediaId, new RequestListener() { +// +// @Override +// public void onFail(String errorMsg) { +// +// } +// +// @Override +// public void onSuccess(ResponseBody data) { +// JSONObject jsonObject = CommonUtils.toJsonObject(data); +// if (jsonObject != null) { +// ResponsePlayUrl responsePlayUrl = JsonHelper.ResolvePlayUrlJson(jsonObject); +// if (responsePlayUrl == null) { +// // TODO: 2024/9/27 +// return; +// } +// String uri = ""; +// if (responsePlayUrl.getAudioUrlMedium() != null) { +// uri = responsePlayUrl.getAudioUrlMedium(); +// } else { +// uri = responsePlayUrl.getAudioUrlLow(); +// } +// CommonUtils.LogMsg("------createMediaSource----------="+mediaItem.mediaId+"---------"+uri); +// ProgressiveMediaSource mediaSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory) +// .createMediaSource(MediaItem.fromUri(uri)); +// player.setMediaSource(mediaSource); +// player.prepare(); +// +// } +// +// +// } +// }); + return null; + } +} diff --git a/app/src/main/java/com/hi/music/player/network/JsonHelper.java b/app/src/main/java/com/hi/music/player/network/JsonHelper.java index 9a2472e..2898e9d 100644 --- a/app/src/main/java/com/hi/music/player/network/JsonHelper.java +++ b/app/src/main/java/com/hi/music/player/network/JsonHelper.java @@ -244,7 +244,6 @@ public class JsonHelper { if (mimeType.contains("audio/mp4")) { String url = jsonIndex.getString("url"); boolean audioQuality1 = jsonIndex.has("audioQuality"); - CommonUtils.LogMsg("------------itag="+itag+"---------audioQuality1="+audioQuality1); if (jsonIndex.has("audioQuality")) { String audioQuality = jsonIndex.getString("audioQuality"); if (audioQuality.equals("AUDIO_QUALITY_MEDIUM")) { diff --git a/app/src/main/java/com/hi/music/player/network/ObserverWrapper.java b/app/src/main/java/com/hi/music/player/network/ObserverWrapper.java index e98594d..7c6f9e9 100644 --- a/app/src/main/java/com/hi/music/player/network/ObserverWrapper.java +++ b/app/src/main/java/com/hi/music/player/network/ObserverWrapper.java @@ -15,12 +15,12 @@ public class ObserverWrapper implements Observer { @Override public void onSubscribe(Disposable d) { - CommonUtils.LogMsg("----------onSubscribe"); + } @Override public void onNext(T t) { - CommonUtils.LogMsg("----------onNext"); + requestListener.onSuccess(t); } @@ -32,7 +32,7 @@ public class ObserverWrapper implements Observer { @Override public void onComplete() { - CommonUtils.LogMsg("----------onComplete"); + } } diff --git a/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java index 6b42c2c..ab8f761 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/PlayActivity.java @@ -57,8 +57,6 @@ public class PlayActivity extends BaseActivity implements S //接口返回的播放列表(没有音频数据) private List mPlayList; - //播放列对应的音频数据 - private List mPlayUrls; private ResponsePlayUrl mCurPlayInfo; private ResponsePlayListInfo musicInfo; @@ -66,12 +64,14 @@ public class PlayActivity extends BaseActivity implements S private Runnable mRunnable; private MyMediaControllerManager mediaControllerManager; + private AdapterPlayList adapterPlayList; + //播放列表ui初始化 private boolean initPlayList = false; private GradientDrawable gradientDrawable; - private int lighterColor,darkerColor; + private int lighterColor, darkerColor; @Override @@ -137,12 +137,12 @@ public class PlayActivity extends BaseActivity implements S mediaControllerManager = MyMediaControllerManager.getInstance(); String videoId = responseSingle.getVideoId(); MediaItem currentMediaItem = mediaControllerManager.getMediaController().getCurrentMediaItem(); - if(currentMediaItem != null){ - if(currentMediaItem.mediaId.equals(videoId)){ + if (currentMediaItem != null) { + if (currentMediaItem.mediaId.equals(videoId)) { // TODO: 2024/9/27 正在播放当前歌曲,又点进来 // mediaControllerManager.getMediaController().seekTo(0); } - if(mediaControllerManager.getMediaController().isPlaying()){ + if (mediaControllerManager.getMediaController().isPlaying()) { mediaControllerManager.stop(); } mediaControllerManager.resetPlayList(); @@ -170,6 +170,7 @@ public class PlayActivity extends BaseActivity implements S break; case Player.STATE_ENDED: + //播放完成 vb.btnPlay.setSelected(false); CommonUtils.LogMsg("-------------playStatus=STATE_ENDED 播放完成"); mHandler.removeCallbacks(mRunnable); // 停止更新 @@ -199,7 +200,7 @@ public class PlayActivity extends BaseActivity implements S @Override public void onChangeMusic(MediaItem mediaItem) { - CommonUtils.LogMsg("111111111-------22222---"+mediaItem.mediaMetadata.title +"---id="+mediaItem.mediaId); + CommonUtils.LogMsg("歌曲切换-" + mediaItem.mediaMetadata.title + "---id=" + mediaItem.mediaId); loadInfo(mediaItem); } @@ -250,7 +251,7 @@ public class PlayActivity extends BaseActivity implements S private void loadInfo(MediaItem mediaItem) { MediaMetadata mediaMetadata = mediaItem.mediaMetadata; - CommonUtils.LogMsg("--------------加载当前播放歌曲信息 " + mediaMetadata.description); + CommonUtils.LogMsg("--------------加载当前播放歌曲信息 "); if (mediaMetadata.artworkUri != null) { loadCovert(mediaMetadata.artworkUri.toString()); } @@ -263,7 +264,9 @@ public class PlayActivity extends BaseActivity implements S vb.playProgress.setMax((int) durationMs); vb.progressBarBuffer.setMax((int) durationMs); } - + if (vb.layoutPlayList.linearLayout.getVisibility() == View.VISIBLE) { + updatePlayListUi(); + } } @@ -289,14 +292,19 @@ public class PlayActivity extends BaseActivity implements S if (color == -1) { return; } - lighterColor = CommonUtils.adjustBrightness(color, 1.2f); // 比原始颜色亮 20% - darkerColor = CommonUtils.adjustBrightness(color, 0.8f); // 比原始颜色暗 20% - gradientDrawable = new GradientDrawable( + lighterColor = CommonUtils.adjustBrightness(color, 1.2f); // 比原始颜色亮 20% + darkerColor = CommonUtils.adjustBrightness(color, 0.8f); // 比原始颜色暗 20% + gradientDrawable = new GradientDrawable( GradientDrawable.Orientation.TOP_BOTTOM, new int[]{lighterColor, darkerColor} // 浅到深渐变 ); vb.rootLayout.setBackground(gradientDrawable); + if (vb.layoutPlayList.linearLayout.getVisibility() == View.VISIBLE) { + updatePlayListColor(); + } + + } }); @@ -355,6 +363,9 @@ public class PlayActivity extends BaseActivity implements S } else { mediaControllerManager.pause(); } + if(adapterPlayList!= null){ + adapterPlayList.updateCurMusicAnimation(); + } } } @@ -374,52 +385,14 @@ public class PlayActivity extends BaseActivity implements S if (!initPlayList) { List playList = mediaControllerManager.getPlayList(); - AdapterPlayList adapterPlayList = new AdapterPlayList(); + adapterPlayList = new AdapterPlayList(); vb.layoutPlayList.recyclerList.setLayoutManager(new LinearLayoutManager(MusicApplication.myApplication)); adapterPlayList.addData(playList); vb.layoutPlayList.recyclerList.setAdapter(adapterPlayList); vb.layoutPlayList.imPlay.setOnClickListener(this); initPlayList = true; } - - MediaItem currentMediaItem = mediaControllerManager.getMediaController().getCurrentMediaItem(); - if (currentMediaItem != null) { - Uri artworkUri = currentMediaItem.mediaMetadata.artworkUri; - vb.layoutPlayList.topSongName.setText(currentMediaItem.mediaMetadata.title); - vb.layoutPlayList.topSingerName.setText(currentMediaItem.mediaMetadata.artist); - - - vb.layoutPlayList.topLayout.setBackgroundColor(darkerColor); - GradientDrawable gradientDrawable = new GradientDrawable( - GradientDrawable.Orientation.TOP_BOTTOM, - new int[]{darkerColor, darkerColor} - ); - vb.rootLayout.setBackground(gradientDrawable); - Drawable newDrawable = CommonUtils.getNewDrawable(lighterColor, 24f, 24f, 0, 0); - vb.layoutPlayList.listLayout.setBackground(newDrawable); - - - Glide.with(MusicApplication.myApplication) - .asDrawable() - .apply(RequestOptions.bitmapTransform(new RoundedCorners(CommonUtils.dpToPx(10)))) - .load(artworkUri) - .placeholder(R.mipmap.ic_launcher) - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target target, boolean isFirstResource) { - CommonUtils.LogMsg(e.getMessage()); - return false; - } - @OptIn(markerClass = UnstableApi.class) - @Override - public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { - - return false; - } - }) - .into(vb.layoutPlayList.topIm); - } - vb.layoutPlayList.imPlay.setSelected(mediaControllerManager.getMediaController().isPlaying()); + updatePlayListUi(); } else { @@ -434,6 +407,56 @@ public class PlayActivity extends BaseActivity implements S } + /** + * 更新播放列表的显示 + */ + private void updatePlayListUi() { + CommonUtils.LogMsg("----------更新播放列表的显示"); + + MediaItem currentMediaItem = mediaControllerManager.getMediaController().getCurrentMediaItem(); + if (currentMediaItem != null) { + if (adapterPlayList != null) { + adapterPlayList.setCurVideId(currentMediaItem.mediaId); + } + Uri artworkUri = currentMediaItem.mediaMetadata.artworkUri; + vb.layoutPlayList.topSongName.setText(currentMediaItem.mediaMetadata.title); + vb.layoutPlayList.topSingerName.setText(currentMediaItem.mediaMetadata.artist); + updatePlayListColor(); + Glide.with(MusicApplication.myApplication) + .asDrawable() + .apply(RequestOptions.bitmapTransform(new RoundedCorners(CommonUtils.dpToPx(10)))) + .load(artworkUri) + .placeholder(R.mipmap.ic_launcher) + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, @Nullable Object model, @NonNull Target target, boolean isFirstResource) { + CommonUtils.LogMsg(e.getMessage()); + return false; + } + + @OptIn(markerClass = UnstableApi.class) + @Override + public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { + + return false; + } + }) + .into(vb.layoutPlayList.topIm); + } + vb.layoutPlayList.imPlay.setSelected(mediaControllerManager.getMediaController().isPlaying()); + } + + private void updatePlayListColor() { + vb.layoutPlayList.topLayout.setBackgroundColor(darkerColor); + GradientDrawable gradientDrawable = new GradientDrawable( + GradientDrawable.Orientation.TOP_BOTTOM, + new int[]{darkerColor, darkerColor} + ); + vb.rootLayout.setBackground(gradientDrawable); + Drawable newDrawable = CommonUtils.getNewDrawable(lighterColor, 24f, 24f, 0, 0); + vb.layoutPlayList.listLayout.setBackground(newDrawable); + } + @Override protected void onDestroy() { super.onDestroy(); @@ -443,7 +466,7 @@ public class PlayActivity extends BaseActivity implements S @Override public void onBackPressed() { - if (vb.layoutPlayList.linearLayout.getVisibility()==View.VISIBLE) { + if (vb.layoutPlayList.linearLayout.getVisibility() == View.VISIBLE) { initShowPlayList(false); } else { super.onBackPressed(); // 调用系统默认的返回行为 diff --git a/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java b/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java index 7179e4e..c01ec40 100644 --- a/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java +++ b/app/src/main/java/com/hi/music/player/ui/activity/viewmodel/VMPlay.java @@ -37,9 +37,6 @@ public class VMPlay extends ViewModel { String videoId = responseSingle.getVideoId(); String params = responseSingle.getParams(); String musicVideoType = responseSingle.getMusicVideoType(); - - CommonUtils.LogMsg("111111111-------0000---"+responseSingle.getSongTitle() +"---id="+videoId); - RetrofitManager.getInstance().getPlayList(params, playlistId, videoId, musicVideoType, new RequestListener() { @Override @@ -54,7 +51,6 @@ public class VMPlay extends ViewModel { List responsePlayListInfos = JsonHelper.ResolvePlayListJson(jsonObject); MyMediaControllerManager.getInstance().setPlayList(responsePlayListInfos); _playList.setValue(responsePlayListInfos); - CommonUtils.LogMsg("111111111-------1111----"+responsePlayListInfos.get(0).getSongTitle() +"---id="+responsePlayListInfos.get(0).getVideoId()); getPlayUrl(responseSingle.getVideoId(),0,true); } else { _playList.setValue(null); @@ -83,7 +79,8 @@ public class VMPlay extends ViewModel { // TODO: 2024/9/27 return; } - MyMediaControllerManager.getInstance().addMusicToPlayList(responsePlayUrl,playListIndex); + MyMediaControllerManager.getInstance().UpdateAudioUrl(responsePlayUrl,playListIndex); +// MyMediaControllerManager.getInstance().addMusicToPlayList(responsePlayUrl,playListIndex); customerUrlInfo.setPlayUrl(responsePlayUrl); customerUrlInfo.setPlayMusicIndex(playListIndex); diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index 920e11f..afd771b 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -2,15 +2,15 @@ - - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_play_list.xml b/app/src/main/res/layout/dialog_play_list.xml index 8409438..83a5168 100644 --- a/app/src/main/res/layout/dialog_play_list.xml +++ b/app/src/main/res/layout/dialog_play_list.xml @@ -25,6 +25,7 @@ android:id="@+id/top_im" android:layout_width="60dp" android:layout_height="60dp" + android:scaleType="fitXY" android:layout_marginStart="10dp" android:src="@mipmap/ic_launcher" /> @@ -64,11 +65,11 @@ diff --git a/app/src/main/res/layout/item_play_list.xml b/app/src/main/res/layout/item_play_list.xml index 58d52c5..7e3f8eb 100644 --- a/app/src/main/res/layout/item_play_list.xml +++ b/app/src/main/res/layout/item_play_list.xml @@ -1,39 +1,38 @@ + android:src="@mipmap/ic_launcher" /> - - + android:layout_alignBottom="@id/im_covert" + android:layout_marginBottom="10dp" /> + #99FFFFFF #59FFFFFF #1A1A1A + #4DFFFFFF #2D9C31 \ No newline at end of file