From 77b8d09ca7b51907dc349d37a67babaec6610060 Mon Sep 17 00:00:00 2001 From: litingting Date: Fri, 20 Sep 2024 18:33:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=92=AD=E6=94=BE=E9=A1=B5=E9=9D=A2=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 9 +- app/src/main/AndroidManifest.xml | 27 ++- .../music/player/adapter/AdapterCategory.java | 6 +- .../hi/music/player/adapter/AdapterHome.java | 7 +- .../music/player/adapter/AdapterSinger.java | 6 +- .../hi/music/player/adapter/BaseAdapter.java | 2 +- .../hi/music/player/helper/CommonUtils.java | 6 +- .../javabean/response/ResponseHome.java | 2 + .../javabean/response/ResponsePlay.java | 108 ++++++++++++ .../{ => child}/ResponseCategory.java | 2 +- .../{ => child}/ResponseHomeChild.java | 2 +- .../response/{ => child}/ResponseSingle.java | 2 +- .../player/media3/MyMediaController.java | 56 ++++++ .../music/player/media3/PlaybackService.java | 32 ++++ .../hi/music/player/network/JsonHelper.java | 161 ++++++++++++++---- .../player/ui/activity/PlayActivity.java | 77 ++++++++- .../player/ui/activity/viewmodel/VMPlay.java | 18 +- .../music/player/ui/fragmnt/HomeFragment.java | 5 +- app/src/main/res/drawable/arrow_bottom.xml | 35 ++++ .../drawable/seekbar_progress_drawable.xml | 18 ++ app/src/main/res/drawable/seekbar_thumb.xml | 10 ++ .../main/res/drawable/selector_icon_play.xml | 6 + app/src/main/res/layout/activity_play.xml | 125 +++++++++++++- app/src/main/res/mipmap-xxxhdpi/icon_list.png | Bin 0 -> 669 bytes .../res/mipmap-xxxhdpi/icon_next_true.png | Bin 0 -> 638 bytes .../main/res/mipmap-xxxhdpi/icon_pause.png | Bin 0 -> 3066 bytes app/src/main/res/mipmap-xxxhdpi/icon_play.png | Bin 0 -> 3161 bytes .../res/mipmap-xxxhdpi/icon_previous_true.png | Bin 0 -> 663 bytes app/src/main/res/values/colors.xml | 4 + 29 files changed, 644 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/com/hi/music/player/javabean/response/ResponsePlay.java rename app/src/main/java/com/hi/music/player/javabean/response/{ => child}/ResponseCategory.java (92%) rename app/src/main/java/com/hi/music/player/javabean/response/{ => child}/ResponseHomeChild.java (93%) rename app/src/main/java/com/hi/music/player/javabean/response/{ => child}/ResponseSingle.java (96%) create mode 100644 app/src/main/java/com/hi/music/player/media3/MyMediaController.java create mode 100644 app/src/main/java/com/hi/music/player/media3/PlaybackService.java create mode 100644 app/src/main/res/drawable/arrow_bottom.xml create mode 100644 app/src/main/res/drawable/seekbar_progress_drawable.xml create mode 100644 app/src/main/res/drawable/seekbar_thumb.xml create mode 100644 app/src/main/res/drawable/selector_icon_play.xml create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_list.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_next_true.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_pause.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_play.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/icon_previous_true.png diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1d78d73..69d6e47 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -51,9 +51,14 @@ dependencies { implementation("com.squareup.retrofit2:adapter-rxjava2:2.9.0") implementation("io.reactivex.rxjava2:rxjava:2.2.21") implementation("io.reactivex.rxjava2:rxandroid:2.1.1") - implementation ("com.squareup.okhttp3:logging-interceptor:4.11.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.11.0") - implementation ("androidx.paging:paging-runtime-ktx:3.3.2") + implementation("androidx.paging:paging-runtime-ktx:3.3.2") implementation("com.github.bumptech.glide:glide:4.16.0") + + //----------media3 + implementation("androidx.media3:media3-exoplayer:1.4.1") + implementation("androidx.media3:media3-session:1.4.1") + //----------media3 } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 14816a1..9a244d2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> + - - + android:exported="true" > + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java b/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java index bb0d8e1..4a5d1ac 100644 --- a/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java +++ b/app/src/main/java/com/hi/music/player/adapter/AdapterCategory.java @@ -2,7 +2,6 @@ package com.hi.music.player.adapter; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; -import android.view.RoundedCorner; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -19,11 +18,8 @@ import com.bumptech.glide.request.target.Target; import com.hi.music.player.MusicApplication; import com.hi.music.player.R; import com.hi.music.player.databinding.ItemCategoryBinding; -import com.hi.music.player.databinding.ItemHomeBinding; -import com.hi.music.player.databinding.ItemSingerBinding; import com.hi.music.player.helper.CommonUtils; -import com.hi.music.player.javabean.response.ResponseCategory; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.child.ResponseCategory; public class AdapterCategory extends BaseAdapter{ diff --git a/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java b/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java index ab1f56a..176dba8 100644 --- a/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java +++ b/app/src/main/java/com/hi/music/player/adapter/AdapterHome.java @@ -11,13 +11,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.hi.music.player.MusicApplication; -import com.hi.music.player.api.ClickSingerListener; import com.hi.music.player.databinding.ItemFooterLoadingBinding; import com.hi.music.player.databinding.ItemHomeBinding; import com.hi.music.player.helper.CommonUtils; -import com.hi.music.player.javabean.response.ResponseCategory; -import com.hi.music.player.javabean.response.ResponseHomeChild; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.child.ResponseCategory; +import com.hi.music.player.javabean.response.child.ResponseHomeChild; +import com.hi.music.player.javabean.response.child.ResponseSingle; import java.util.List; diff --git a/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java b/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java index 3849b14..d23dbf8 100644 --- a/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java +++ b/app/src/main/java/com/hi/music/player/adapter/AdapterSinger.java @@ -1,6 +1,5 @@ package com.hi.music.player.adapter; -import android.content.Intent; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; @@ -19,12 +18,9 @@ import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.Target; import com.hi.music.player.MusicApplication; import com.hi.music.player.R; -import com.hi.music.player.databinding.ItemCategoryBinding; -import com.hi.music.player.databinding.ItemHomeBinding; import com.hi.music.player.databinding.ItemSingerBinding; import com.hi.music.player.helper.CommonUtils; -import com.hi.music.player.javabean.response.ResponseHomeChild; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.child.ResponseSingle; public class AdapterSinger extends BaseAdapter { diff --git a/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java b/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java index 2d14a45..8e2a417 100644 --- a/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java +++ b/app/src/main/java/com/hi/music/player/adapter/BaseAdapter.java @@ -9,7 +9,7 @@ import androidx.viewbinding.ViewBinding; import com.hi.music.player.api.ClickSingerListener; import com.hi.music.player.databinding.ItemFooterLoadingBinding; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.child.ResponseSingle; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/hi/music/player/helper/CommonUtils.java b/app/src/main/java/com/hi/music/player/helper/CommonUtils.java index 117e100..b96d329 100644 --- a/app/src/main/java/com/hi/music/player/helper/CommonUtils.java +++ b/app/src/main/java/com/hi/music/player/helper/CommonUtils.java @@ -17,11 +17,15 @@ public class CommonUtils { private static String TAG = "----MUSIC---------"; + private static String TAG_ERROR = "----ERROR MUSIC---------"; + public static void LogMsg(String msg) { Log.d(TAG, msg); } - + public static void LogErrorMsg(String msg) { + Log.e(TAG_ERROR, msg); + } public static JSONObject toJsonObject(ResponseBody body) { try { diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java b/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java index 00a4a57..329f59a 100644 --- a/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java +++ b/app/src/main/java/com/hi/music/player/javabean/response/ResponseHome.java @@ -2,6 +2,8 @@ package com.hi.music.player.javabean.response; import androidx.annotation.Nullable; +import com.hi.music.player.javabean.response.child.ResponseHomeChild; + import java.util.List; public class ResponseHome { diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlay.java b/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlay.java new file mode 100644 index 0000000..1329845 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/javabean/response/ResponsePlay.java @@ -0,0 +1,108 @@ +package com.hi.music.player.javabean.response; + +public class ResponsePlay { + + //封面 + private String covert; + //歌曲名字 + private String SongTitle; + + //歌手名字 + private String SingerName; + + //专辑名称 + private String AlbumTitle; + + //发行年份 + private String Year; + + //歌曲时长 + private String Duration; + + + private String videoId; + private String playlistId; + private String params; + private String musicVideoType; + + + public String getDuration() { + return Duration; + } + + public void setDuration(String duration) { + Duration = duration; + } + + public String getCovert() { + return covert; + } + + public void setCovert(String covert) { + this.covert = covert; + } + + public String getSongTitle() { + return SongTitle; + } + + public void setSongTitle(String songTitle) { + SongTitle = songTitle; + } + + public String getSingerName() { + return SingerName; + } + + public void setSingerName(String singerName) { + SingerName = singerName; + } + + public String getAlbumTitle() { + return AlbumTitle; + } + + public void setAlbumTitle(String albumTitle) { + AlbumTitle = albumTitle; + } + + public String getYear() { + return Year; + } + + public void setYear(String year) { + Year = year; + } + + public String getVideoId() { + return videoId; + } + + public void setVideoId(String videoId) { + this.videoId = videoId; + } + + public String getPlaylistId() { + return playlistId; + } + + public void setPlaylistId(String playlistId) { + this.playlistId = playlistId; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + public String getMusicVideoType() { + return musicVideoType; + } + + public void setMusicVideoType(String musicVideoType) { + this.musicVideoType = musicVideoType; + } +} diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponseCategory.java b/app/src/main/java/com/hi/music/player/javabean/response/child/ResponseCategory.java similarity index 92% rename from app/src/main/java/com/hi/music/player/javabean/response/ResponseCategory.java rename to app/src/main/java/com/hi/music/player/javabean/response/child/ResponseCategory.java index ba2b2c9..049234c 100644 --- a/app/src/main/java/com/hi/music/player/javabean/response/ResponseCategory.java +++ b/app/src/main/java/com/hi/music/player/javabean/response/child/ResponseCategory.java @@ -1,4 +1,4 @@ -package com.hi.music.player.javabean.response; +package com.hi.music.player.javabean.response.child; public class ResponseCategory { diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponseHomeChild.java b/app/src/main/java/com/hi/music/player/javabean/response/child/ResponseHomeChild.java similarity index 93% rename from app/src/main/java/com/hi/music/player/javabean/response/ResponseHomeChild.java rename to app/src/main/java/com/hi/music/player/javabean/response/child/ResponseHomeChild.java index 3c01e6f..948cb31 100644 --- a/app/src/main/java/com/hi/music/player/javabean/response/ResponseHomeChild.java +++ b/app/src/main/java/com/hi/music/player/javabean/response/child/ResponseHomeChild.java @@ -1,4 +1,4 @@ -package com.hi.music.player.javabean.response; +package com.hi.music.player.javabean.response.child; import java.util.List; diff --git a/app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java b/app/src/main/java/com/hi/music/player/javabean/response/child/ResponseSingle.java similarity index 96% rename from app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java rename to app/src/main/java/com/hi/music/player/javabean/response/child/ResponseSingle.java index 06d2858..7f02462 100644 --- a/app/src/main/java/com/hi/music/player/javabean/response/ResponseSingle.java +++ b/app/src/main/java/com/hi/music/player/javabean/response/child/ResponseSingle.java @@ -1,4 +1,4 @@ -package com.hi.music.player.javabean.response; +package com.hi.music.player.javabean.response.child; import java.io.Serializable; diff --git a/app/src/main/java/com/hi/music/player/media3/MyMediaController.java b/app/src/main/java/com/hi/music/player/media3/MyMediaController.java new file mode 100644 index 0000000..e1fb097 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/media3/MyMediaController.java @@ -0,0 +1,56 @@ +package com.hi.music.player.media3; + +import android.content.ComponentName; + +import androidx.media3.common.MediaItem; +import androidx.media3.session.MediaController; +import androidx.media3.session.SessionToken; + +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; +import com.hi.music.player.MusicApplication; +import com.hi.music.player.helper.CommonUtils; +import com.hi.music.player.network.RetrofitManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +public class MyMediaController { + + private static volatile MyMediaController MyMediaControllerInstance; + + private MediaController mediaController; + public static MyMediaController getInstance() { + if (MyMediaControllerInstance == null) { + synchronized (RetrofitManager.class) { + if (MyMediaControllerInstance == null) { + MyMediaControllerInstance = new MyMediaController(); + } + } + } + return MyMediaControllerInstance; + } + + private void init(){ + SessionToken sessionToken = + new SessionToken(MusicApplication.myApplication, new ComponentName(MusicApplication.myApplication, PlaybackService.class)); + ListenableFuture controllerFuture = + new MediaController.Builder(MusicApplication.myApplication, sessionToken).buildAsync(); + controllerFuture.addListener(() -> { + // Call controllerFuture.get() to retrieve the MediaController. + // MediaController implements the Player interface, so it can be + // attached to the PlayerView UI component. +// playerView.setPlayer(controllerFuture.get()); + try { + mediaController = controllerFuture.get(); + } catch (ExecutionException | InterruptedException e) { + CommonUtils.LogErrorMsg(e.getMessage()); + } + }, MoreExecutors.directExecutor()); + + + List mediaItems = new ArrayList<>(); + mediaController.addMediaItems(mediaItems); + } +} 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 new file mode 100644 index 0000000..a98d95f --- /dev/null +++ b/app/src/main/java/com/hi/music/player/media3/PlaybackService.java @@ -0,0 +1,32 @@ +package com.hi.music.player.media3; + +import androidx.annotation.Nullable; +import androidx.media3.exoplayer.ExoPlayer; +import androidx.media3.session.MediaSession; +import androidx.media3.session.MediaSessionService; + +public class PlaybackService extends MediaSessionService { + private MediaSession mediaSession = null; + @Override + public void onCreate() { + super.onCreate(); + ExoPlayer player = new ExoPlayer.Builder(this).build(); + mediaSession = new MediaSession.Builder(this, player).build(); + } + + + + @Nullable + @Override + public MediaSession onGetSession(MediaSession.ControllerInfo controllerInfo) { + return mediaSession; + } + + @Override + public void onDestroy() { + mediaSession.getPlayer().release(); + mediaSession.release(); + mediaSession = null; + super.onDestroy(); + } +} 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 ff09ab6..9a0dc8f 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 @@ -1,16 +1,18 @@ package com.hi.music.player.network; import com.hi.music.player.helper.CommonUtils; -import com.hi.music.player.javabean.response.ResponseCategory; +import com.hi.music.player.javabean.response.ResponsePlay; +import com.hi.music.player.javabean.response.child.ResponseCategory; import com.hi.music.player.javabean.response.ResponseHome; -import com.hi.music.player.javabean.response.ResponseHomeChild; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.child.ResponseHomeChild; +import com.hi.music.player.javabean.response.child.ResponseSingle; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class JsonHelper { @@ -76,6 +78,65 @@ public class JsonHelper { } + public static List ResolvePlayJson(JSONObject jsonObject) { + List list = new ArrayList<>(); + try { + JSONObject playlistPanelRenderer = jsonObject.getJSONObject("contents") + .getJSONObject("singleColumnMusicWatchNextResultsRenderer") + .getJSONObject("tabbedRenderer") + .getJSONObject("watchNextTabbedResultsRenderer") + .getJSONArray("tabs") + .getJSONObject(0) + .getJSONObject("tabRenderer") + .getJSONObject("content") + .getJSONObject("musicQueueRenderer") + .getJSONObject("content") + .getJSONObject("playlistPanelRenderer"); + + JSONArray contents = playlistPanelRenderer.getJSONArray("contents"); + + for (int i = 0; i < contents.length(); i++) { + ResponsePlay responsePlay = new ResponsePlay(); + JSONObject playlistPanelVideoRenderer = contents.getJSONObject(i) + .getJSONObject("playlistPanelVideoRenderer"); + + String jsonUrl = getJsonUrl(playlistPanelVideoRenderer); + String songName = getJsonTitle(playlistPanelVideoRenderer.getJSONObject("title"), 0); + + JSONObject longBylineText = playlistPanelVideoRenderer.getJSONObject("longBylineText"); + String singerName = getJsonTitle(longBylineText, 0); + String AlbumTitle = getJsonTitle(longBylineText, 2); + String YearRelease = getJsonTitle(longBylineText, 4); + + String SongDuration = getJsonTitle(playlistPanelVideoRenderer.getJSONObject("lengthText"), 0); + + String[] watchEndPoint = getWatchEndPoint(playlistPanelVideoRenderer); + + responsePlay.setCovert(jsonUrl); + responsePlay.setSongTitle(songName); + responsePlay.setSingerName(singerName); + responsePlay.setAlbumTitle(AlbumTitle); + responsePlay.setYear(YearRelease); + responsePlay.setDuration(SongDuration); + responsePlay.setVideoId(watchEndPoint[0]); + responsePlay.setPlaylistId(watchEndPoint[1]); + responsePlay.setParams(watchEndPoint[2]); + responsePlay.setMusicVideoType(watchEndPoint[3]); + + list.add(responsePlay); + CommonUtils.LogMsg("----------歌曲名字=" + songName + "---" + Arrays.toString(watchEndPoint)); + } + + + } catch (JSONException exception) { + CommonUtils.LogMsg("----------exception="); + exception.printStackTrace(); + + } + return list; + } + + private static void getCommonHome(JSONObject sectionListRenderer, ResponseHome responseHome) throws JSONException { @@ -106,10 +167,10 @@ public class JsonHelper { if (musicCarouselShelfRenderer != null) { //模块标题 - String title = getJsonText(musicCarouselShelfRenderer + String title = getJsonTitle(musicCarouselShelfRenderer .getJSONObject("header") .getJSONObject("musicCarouselShelfBasicHeaderRenderer") - .getJSONObject("title")); + .getJSONObject("title"), 0); CommonUtils.LogMsg("----------headertitle=" + title); responseHomeChild.setHeaderTitle(title); JSONArray childContents = musicCarouselShelfRenderer @@ -139,25 +200,19 @@ public class JsonHelper { .getJSONObject(g) .getJSONObject("musicResponsiveListItemFlexColumnRenderer") .getJSONObject("text"); - String text = getJsonText(jsonObject); + String text = getJsonTitle(jsonObject, 0); if (g == 0) { SongTitle = text; - JSONObject watchEndpoint = jsonObject.getJSONArray("runs") - .getJSONObject(0) - .getJSONObject("navigationEndpoint") - .getJSONObject("watchEndpoint"); - String videoId = watchEndpoint.getString("videoId"); - String playlistId = watchEndpoint.getString("playlistId"); - String params = watchEndpoint.getString("params"); - String musicVideoType = watchEndpoint.getJSONObject("watchEndpointMusicSupportedConfigs") - .getJSONObject("watchEndpointMusicConfig") - .getString("musicVideoType"); + JSONObject runs = jsonObject.getJSONArray("runs") + .getJSONObject(0); - responseSingle.setVideoId(videoId); - responseSingle.setPlaylistId(playlistId); - responseSingle.setParams(params); - responseSingle.setMusicVideoType(musicVideoType); + String[] watchEndPoint = getWatchEndPoint(runs); + + responseSingle.setVideoId(watchEndPoint[0]); + responseSingle.setPlaylistId(watchEndPoint[1]); + responseSingle.setParams(watchEndPoint[2]); + responseSingle.setMusicVideoType(watchEndPoint[3]); } if (g == 1) SingerName = text; @@ -178,7 +233,7 @@ public class JsonHelper { .getJSONObject("thumbnailRenderer")); JSONObject title1 = musicTwoRowItemRenderer.getJSONObject("title"); - String twoTitle = getJsonText(title1); + String twoTitle = getJsonTitle(title1, 0); String twoSubtitle = getJsonTextNew(musicTwoRowItemRenderer.getJSONObject("subtitle")); // String pageType = title1.getJSONObject("navigationEndpoint") // .getJSONObject("browseEndpoint") @@ -190,7 +245,7 @@ public class JsonHelper { responseCategory.setTwoTitle(twoTitle); responseCategory.setTwoSubtitle(twoSubtitle); categoryList.add(responseCategory); - CommonUtils.LogMsg(" ----------2222222222----twoTitle=" + twoTitle + "-twoSubtitle=" + twoSubtitle ); + CommonUtils.LogMsg(" ----------2222222222----twoTitle=" + twoTitle + "-twoSubtitle=" + twoSubtitle); } } @@ -204,12 +259,50 @@ public class JsonHelper { } + + private static String[] getWatchEndPoint(JSONObject job) { + + String[] strings = new String[4]; + try { + JSONObject watchEndpoint = job + .getJSONObject("navigationEndpoint") + .getJSONObject("watchEndpoint"); + if (watchEndpoint.has("videoId")) { + strings[0] = watchEndpoint.getString("videoId"); + } + if (watchEndpoint.has("playlistId")) { + strings[1] = watchEndpoint.getString("playlistId"); + } + if (watchEndpoint.has("params")) { + strings[2] = watchEndpoint.getString("params"); + } + if (watchEndpoint.has("watchEndpointMusicSupportedConfigs")) { + strings[3] = watchEndpoint.getJSONObject("watchEndpointMusicSupportedConfigs") + .getJSONObject("watchEndpointMusicConfig") + .getString("musicVideoType"); + } +// String videoId = watchEndpoint.getString("videoId"); +// String playlistId = watchEndpoint.getString("playlistId"); +// String params = watchEndpoint.getString("params"); +// String musicVideoType = watchEndpoint.getJSONObject("watchEndpointMusicSupportedConfigs") +// .getJSONObject("watchEndpointMusicConfig") +// .getString("musicVideoType"); + } catch (JSONException exception) { + exception.printStackTrace(); + } + return strings; + } + + //取最大的一张图片 private static String getJsonUrl(JSONObject jsonObject) { try { - JSONArray jsonArray = jsonObject.getJSONObject("musicThumbnailRenderer") + boolean b = jsonObject.has("musicThumbnailRenderer"); + if (b) { + jsonObject = jsonObject.getJSONObject("musicThumbnailRenderer"); + } + JSONArray jsonArray = jsonObject .getJSONObject("thumbnail") .getJSONArray("thumbnails"); - int length = jsonArray.length(); CommonUtils.LogMsg("----------length=" + (length - 1)); String pngUrl = jsonArray.getJSONObject(length - 1) @@ -222,24 +315,28 @@ public class JsonHelper { } - private static String getJsonText(JSONObject jsonObject) { + private static String getJsonTitle(JSONObject jsonObject, int index) { + String text = ""; try { - String text = jsonObject.getJSONArray("runs") - .getJSONObject(0) - .getString("text"); + JSONArray runs = jsonObject.getJSONArray("runs"); + if (index < runs.length()) { + text = runs + .getJSONObject(index) + .getString("text"); + } - return text; } catch (JSONException exception) { - return ""; + exception.printStackTrace(); } + return text; } private static String getJsonTextNew(JSONObject jsonObject) { - StringBuilder text= new StringBuilder(); + StringBuilder text = new StringBuilder(); try { JSONArray runs = jsonObject.getJSONArray("runs"); - for (int i =0;i { @@ -24,17 +48,58 @@ public class PlayActivity extends BaseActivity { Intent intent = getIntent(); responseSingle = (ResponseSingle) intent.getSerializableExtra(MyValue.KEY_PLAY_ACTIVITY_SINGER); vmPlay = getActivityScopeViewModel(VMPlay.class); + vmPlay.getPlay(responseSingle); - - vb.btn.setOnClickListener(new View.OnClickListener() { + vmPlay.data.observe(this, new Observer>() { @Override - public void onClick(View v) { - vmPlay.getPlay(responseSingle); + public void onChanged(List playList) { + if (playList.size() > 0) { + ResponsePlay responsePlay = playList.get(0); + loadCovert(responsePlay.getCovert()); + loadInfo(responsePlay); + + } + } }); } + private void loadInfo(ResponsePlay data) { + vb.tvSongName.setText(data.getSongTitle()); + vb.tvSingerName.setText(data.getSingerName()); + vb.tvDuration.setText(data.getDuration()); + } + + private void loadCovert(String url) { + Glide.with(MusicApplication.myApplication) + .asDrawable() + .apply(RequestOptions.bitmapTransform(new RoundedCorners(CommonUtils.dpToPx(16)))) + .load(url) + .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; + } + + @Override + public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target target, @NonNull DataSource dataSource, boolean isFirstResource) { + return false; + } + }) + .into(vb.imCovert); + } + + + + @Override + public void onStart() { + super.onStart(); + + } + @Override public boolean isFullScreen() { return false; 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 b3a3d63..a44db91 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 @@ -7,19 +7,22 @@ import androidx.lifecycle.ViewModel; import com.hi.music.player.api.RequestListener; import com.hi.music.player.helper.CommonUtils; import com.hi.music.player.javabean.response.ResponseHome; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.ResponsePlay; +import com.hi.music.player.javabean.response.child.ResponseSingle; import com.hi.music.player.network.JsonHelper; import com.hi.music.player.network.RetrofitManager; import org.json.JSONObject; +import java.util.List; + import okhttp3.ResponseBody; public class VMPlay extends ViewModel { - private MutableLiveData _data = new MutableLiveData(); - public LiveData data = _data; + private MutableLiveData> _data = new MutableLiveData>(); + public LiveData> data = _data; private String continuation, clickTrackingParams, visitorData; @@ -29,7 +32,7 @@ public class VMPlay extends ViewModel { String params = responseSingle.getParams(); String musicVideoType = responseSingle.getMusicVideoType(); - RetrofitManager.getInstance().getNext(params,playlistId,videoId,musicVideoType,new RequestListener() { + RetrofitManager.getInstance().getNext(params, playlistId, videoId, musicVideoType, new RequestListener() { @Override public void onFail(String errorMsg) { @@ -40,9 +43,8 @@ public class VMPlay extends ViewModel { public void onSuccess(ResponseBody data) { JSONObject jsonObject = CommonUtils.toJsonObject(data); if (jsonObject != null) { - - -// _data.setValue(responseHome); + List responsePlays = JsonHelper.ResolvePlayJson(jsonObject); + _data.setValue(responsePlays); } else { _data.setValue(null); } @@ -52,6 +54,4 @@ public class VMPlay extends ViewModel { } - - } diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java index cabc50b..b5e18e3 100644 --- a/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/HomeFragment.java @@ -8,15 +8,14 @@ import androidx.lifecycle.Observer; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.hi.music.player.R; import com.hi.music.player.adapter.AdapterHome; import com.hi.music.player.api.ClickSingerListener; import com.hi.music.player.databinding.FragmentHomeBinding; import com.hi.music.player.helper.CommonUtils; import com.hi.music.player.helper.MyValue; import com.hi.music.player.javabean.response.ResponseHome; -import com.hi.music.player.javabean.response.ResponseHomeChild; -import com.hi.music.player.javabean.response.ResponseSingle; +import com.hi.music.player.javabean.response.child.ResponseHomeChild; +import com.hi.music.player.javabean.response.child.ResponseSingle; import com.hi.music.player.ui.activity.PlayActivity; import com.hi.music.player.ui.fragmnt.viewmodel.VMHome; diff --git a/app/src/main/res/drawable/arrow_bottom.xml b/app/src/main/res/drawable/arrow_bottom.xml new file mode 100644 index 0000000..352178a --- /dev/null +++ b/app/src/main/res/drawable/arrow_bottom.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/seekbar_progress_drawable.xml b/app/src/main/res/drawable/seekbar_progress_drawable.xml new file mode 100644 index 0000000..287af61 --- /dev/null +++ b/app/src/main/res/drawable/seekbar_progress_drawable.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seekbar_thumb.xml b/app/src/main/res/drawable/seekbar_thumb.xml new file mode 100644 index 0000000..104bb46 --- /dev/null +++ b/app/src/main/res/drawable/seekbar_thumb.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_icon_play.xml b/app/src/main/res/drawable/selector_icon_play.xml new file mode 100644 index 0000000..496cccb --- /dev/null +++ b/app/src/main/res/drawable/selector_icon_play.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index ff165a0..3259cd2 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -4,14 +4,131 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/black" tools:context=".ui.activity.PlayActivity"> -