* Created by 残渊 on 2018/11/30.
*/
-
public class LoveSongAdapter extends RecyclerView.Adapter {
- private static final String TAG = "LoveSongAdapter";
- private int footerViewType = 1;
- private int itemViewType = 0;
- private List mLoveList;
- private Context mContext;
- private int mLastPosition = -1;
- private OnItemClickListener onItemClickListener;
+ private static final String TAG = "LoveSongAdapter"; // 用于日志输出的标签
+ private int footerViewType = 1; // 底部视图类型标识
+ private int itemViewType = 0; // 列表项视图类型标识
+ private List mLoveList; // 存储喜欢的歌曲数据
+ private Context mContext; // 上下文对象
+ private int mLastPosition = -1; // 上一次点击的位置
+ private OnItemClickListener onItemClickListener; // 点击事件监听器
+ /**
+ * 设置点击事件监听器。
+ * @param onItemClickListener 点击事件监听器
+ */
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
+ /**
+ * 构造函数,初始化上下文和喜欢的歌曲列表。
+ * @param context 上下文对象
+ * @param loveList 喜欢的歌曲列表
+ */
public LoveSongAdapter(Context context, List loveList) {
mContext = context;
mLoveList = loveList;
}
-
-
+ // ViewHolder,用于缓存视图,提高列表滚动性能
class ViewHolder extends RecyclerView.ViewHolder {
- TextView songNameTv;
- TextView singerTv;
- View playLine;
- RippleView item;
+ TextView songNameTv; // 歌曲名称文本
+ TextView singerTv; // 歌手文本
+ View playLine; // 播放线条视图
+ RippleView item; // 带有水波纹效果的视图
public ViewHolder(View itemView) {
super(itemView);
- songNameTv = itemView.findViewById(R.id.tv_title);
+ songNameTv = itemView.findViewById(R.id.tv_title); // 初始化视图
singerTv = itemView.findViewById(R.id.tv_artist);
playLine = itemView.findViewById(R.id.line_play);
item = itemView.findViewById(R.id.ripple);
@@ -58,11 +69,10 @@ public class LoveSongAdapter extends RecyclerView.Adapter
Date: Mon, 16 Dec 2024 18:54:35 +0800
Subject: [PATCH 07/23] Update SearchContentAdapter.java
---
.../adapter/SearchContentAdapter.java | 59 +++++++++++--------
1 file changed, 36 insertions(+), 23 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java
index 52ae47a..0c5c659 100644
--- a/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java
+++ b/app/src/main/java/com/example/musicplayer/adapter/SearchContentAdapter.java
@@ -1,5 +1,7 @@
package com.example.musicplayer.adapter;
+// 导入所需的包和类
+
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
@@ -25,30 +27,32 @@ import java.util.ArrayList;
import java.util.List;
/**
+ * 搜索内容适配器,用于展示搜索结果中的单曲和专辑列表。
* Created by 残渊 on 2018/11/21.
*/
-
public class SearchContentAdapter extends RecyclerView.Adapter {
private static final String TAG = "SearchContentAdapter";
- private ArrayList mSongListBeans;
- private List mAlbumList;
- private static OnItemClickListener mItemClick;
- private static OnAlbumItemClickListener mAlbumClick;
- private String mSeek;
- private Context mContext;
- private int mLastPosition = -1;
- private int mType;
-
+ private ArrayList mSongListBeans; // 单曲列表数据
+ private List mAlbumList; // 专辑列表数据
+ private static OnItemClickListener mItemClick; // 单曲点击事件监听器
+ private static OnAlbumItemClickListener mAlbumClick; // 专辑点击事件监听器
+ private String mSeek; // 搜索关键字
+ private Context mContext; // 上下文对象
+ private int mLastPosition = -1; // 上一次点击的位置
+ private int mType; // 列表类型,单曲或专辑
+ // 设置单曲点击事件监听器
public static void setItemClick(OnItemClickListener itemClick) {
mItemClick = itemClick;
}
+ // 设置专辑点击事件监听器
public static void setAlbumClick(OnAlbumItemClickListener albumClick) {
mAlbumClick = albumClick;
}
+ // 构造函数,初始化专辑搜索适配器
public SearchContentAdapter(List dataBeans, String seek, Context context, int type) {
mContext = context;
mSeek = seek;
@@ -56,7 +60,7 @@ public class SearchContentAdapter extends RecyclerView.Adapter songListBeans, String seek, Context context, int type) {
mContext = context;
mSeek = seek;
@@ -64,10 +68,11 @@ public class SearchContentAdapter extends RecyclerView.Adapter {
mItemClick.onClick(position);
equalPosition(position);
@@ -113,21 +120,24 @@ public class SearchContentAdapter extends RecyclerView.Adapter {
mAlbumClick.onClick(position);
});
}
}
-
+ // 获取列表项的总数
@Override
public int getItemCount() {
if (mType == Constant.TYPE_SONG) {
@@ -138,6 +148,7 @@ public class SearchContentAdapter extends RecyclerView.Adapter
Date: Mon, 16 Dec 2024 18:58:47 +0800
Subject: [PATCH 08/23] Update SearchHistoryAdapter.java
---
.../adapter/SearchHistoryAdapter.java | 86 +++++++++++--------
1 file changed, 51 insertions(+), 35 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/adapter/SearchHistoryAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SearchHistoryAdapter.java
index ce4777a..36b5ff5 100644
--- a/app/src/main/java/com/example/musicplayer/adapter/SearchHistoryAdapter.java
+++ b/app/src/main/java/com/example/musicplayer/adapter/SearchHistoryAdapter.java
@@ -1,5 +1,7 @@
package com.example.musicplayer.adapter;
+// 导入所需的包和类
+
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
@@ -18,64 +20,72 @@ import com.example.musicplayer.entiy.SearchHistory;
import java.util.List;
/**
- * 历史记录的适配器
+ * 历史记录的适配器,用于展示搜索历史列表。
* Created by 残渊 on 2018/11/29.
*/
-
public class SearchHistoryAdapter extends RecyclerView.Adapter {
- private List mSearchHistoryList;
- private static final int mHistoryType =0;
- private static final int mFooterType = 1;
- private OnItemClickListener mOnItemClickListener;
- private OnDeleteClickListener mOnDeleteClickListener;
- private OnFooterClickListener mFooterClickListener;
-
- public SearchHistoryAdapter(List searchHistoryList){
+ private List mSearchHistoryList; // 搜索历史列表数据
+ private static final int mHistoryType = 0; // 历史记录项的视图类型
+ private static final int mFooterType = 1; // 底部删除按钮的视图类型
+ private OnItemClickListener mOnItemClickListener; // 列表项点击事件监听器
+ private OnDeleteClickListener mOnDeleteClickListener; // 删除按钮点击事件监听器
+ private OnFooterClickListener mFooterClickListener; // 底部删除所有按钮点击事件监听器
+
+ // 构造函数,初始化搜索历史列表
+ public SearchHistoryAdapter(List searchHistoryList) {
mSearchHistoryList = searchHistoryList;
}
+ // 创建ViewHolder
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- if(viewType ==mHistoryType){
- View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_seek_history_item,
- parent,false);
+ if (viewType == mHistoryType) {
+ // 历史记录项布局
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_seek_history_item, parent, false);
return new HistoryHolder(view);
- }else{
- View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_delete_all_history_item,
- parent,false);
+ } else {
+ // 底部删除所有按钮布局
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.footer_delete_all_history_item, parent, false);
return new FooterHolder(view);
-
}
}
+ // 将数据绑定到ViewHolder
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
- if(holder instanceof HistoryHolder){
- HistoryHolder historyHolder =(HistoryHolder) holder;
+ if (holder instanceof HistoryHolder) {
+ HistoryHolder historyHolder = (HistoryHolder) holder;
+ // 设置历史记录文本
historyHolder.historyTv.setText(mSearchHistoryList.get(position).getHistory());
+ // 设置删除按钮点击事件
historyHolder.deleteIv.setOnClickListener(v -> mOnDeleteClickListener.onClick(position));
-
+ // 设置列表项点击事件
historyHolder.mItemView.setOnRippleCompleteListener(rippleView -> mOnItemClickListener.onClick(position));
- }else{
- FooterHolder footerHolder =(FooterHolder) holder;
+ } else {
+ FooterHolder footerHolder = (FooterHolder) holder;
+ // 设置底部删除所有按钮点击事件
footerHolder.deleteView.setOnClickListener(v -> mFooterClickListener.onClick());
}
}
+ // 获取列表项的总数
@Override
public int getItemCount() {
- return mSearchHistoryList.size()+1;
+ return mSearchHistoryList.size() + 1; // 加1是为了显示底部删除所有按钮
}
+
+ // 获取列表项的视图类型
@Override
public int getItemViewType(int position) {
- return position + 1 == getItemCount() ? mFooterType :mHistoryType;
+ return position + 1 == getItemCount() ? mFooterType : mHistoryType;
}
+ // 内部类HistoryHolder,用于历史记录列表项
private class HistoryHolder extends RecyclerView.ViewHolder {
- TextView historyTv;
- ImageView deleteIv;
- RippleView mItemView;
+ TextView historyTv; // 历史记录文本
+ ImageView deleteIv; // 删除按钮
+ RippleView mItemView; // 列表项背景
public HistoryHolder(View itemView) {
super(itemView);
@@ -85,8 +95,9 @@ public class SearchHistoryAdapter extends RecyclerView.Adapter
Date: Mon, 16 Dec 2024 19:01:00 +0800
Subject: [PATCH 09/23] Update SongAdapter.java
---
.../musicplayer/adapter/SongAdapter.java | 77 ++++++++++---------
1 file changed, 39 insertions(+), 38 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java
index d943e3b..9d4adc0 100644
--- a/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java
+++ b/app/src/main/java/com/example/musicplayer/adapter/SongAdapter.java
@@ -1,5 +1,7 @@
package com.example.musicplayer.adapter;
+// 导入所需的包和类
+
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull;
@@ -21,33 +23,35 @@ import java.util.List;
import java.util.Objects;
/**
+ * 歌曲列表的适配器,用于展示本地歌曲。
* Created by 残渊 on 2018/10/10.
*/
-
public class SongAdapter extends RecyclerView.Adapter {
- private static final String TAG = "SongAdapter";
- private int footerViewType = 1;
- private int itemViewType = 0;
- private List mMp3InfoList;
- private Context mContext;
- private int mLastPosition = -1;
- private OnItemClickListener onItemClickListener;
-
+ private static final String TAG = "SongAdapter"; // 用于日志输出的标签
+ private int footerViewType = 1; // 底部视图类型标识
+ private int itemViewType = 0; // 列表项视图类型标识
+ private List mMp3InfoList; // 本地歌曲列表数据
+ private Context mContext; // 上下文对象
+ private int mLastPosition = -1; // 上一次点击的位置
+ private OnItemClickListener onItemClickListener; // 点击事件监听器
+
+ // 设置点击事件监听器
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
+ // 构造函数,初始化上下文和本地歌曲列表
public SongAdapter(Context context, List mp3InfoList) {
mContext = context;
mMp3InfoList = mp3InfoList;
}
-
+ // 内部类ViewHolder,用于歌曲列表项
static class ViewHolder extends RecyclerView.ViewHolder {
- TextView songNameTv;
- TextView artistTv;
- ImageView playingIv;
- RippleView songView;
+ TextView songNameTv; // 歌曲名称文本
+ TextView artistTv; // 歌手文本
+ ImageView playingIv; // 播放状态图标
+ RippleView songView; // 歌曲项背景
public ViewHolder(View itemView) {
super(itemView);
@@ -58,12 +62,9 @@ public class SongAdapter extends RecyclerView.Adapter {
}
}
- /**
- * 底部holder
- */
+ // 底部holder
static class FooterHolder extends RecyclerView.ViewHolder {
-
- TextView numTv;
+ TextView numTv; // 底部信息文本
public FooterHolder(View itemView) {
super(itemView);
@@ -71,6 +72,7 @@ public class SongAdapter extends RecyclerView.Adapter {
}
}
+ // 创建ViewHolder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == itemViewType) {
@@ -86,6 +88,7 @@ public class SongAdapter extends RecyclerView.Adapter {
}
}
+ // 将数据绑定到ViewHolder
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
@@ -95,20 +98,20 @@ public class SongAdapter extends RecyclerView.Adapter {
holder.songNameTv.setText(mp3Info.getName());
holder.artistTv.setText(mp3Info.getSinger());
- //根据播放的歌曲是否为当前列表的歌曲显示
+ // 根据播放的歌曲是否为当前列表的歌曲显示
String songId = Objects.requireNonNull(FileUtil.getSong()).getSongId();
- if(songId!=null&&(mp3Info.getSongId().equals(songId))){
- holder.songNameTv.setTextColor(App.getContext().
- getResources().getColor(R.color.musicStyle_low));
- holder.artistTv.setTextColor(App.getContext().
- getResources().getColor(R.color.musicStyle_low));
+ if (songId != null && mp3Info.getSongId().equals(songId)) {
+ holder.songNameTv.setTextColor(App.getContext()
+ .getResources().getColor(R.color.musicStyle_low));
+ holder.artistTv.setTextColor(App.getContext()
+ .getResources().getColor(R.color.musicStyle_low));
holder.playingIv.setVisibility(View.VISIBLE);
mLastPosition = position;
- }else {
- holder.songNameTv.setTextColor(App.getContext().
- getResources().getColor(R.color.white));
- holder.artistTv.setTextColor(App.getContext().
- getResources().getColor(R.color.white));
+ } else {
+ holder.songNameTv.setTextColor(App.getContext()
+ .getResources().getColor(R.color.white));
+ holder.artistTv.setTextColor(App.getContext()
+ .getResources().getColor(R.color.white));
holder.playingIv.setVisibility(View.GONE);
}
holder.songView.setOnRippleCompleteListener(rippleView -> {
@@ -117,11 +120,11 @@ public class SongAdapter extends RecyclerView.Adapter {
});
} else {
FooterHolder footerHolder = (FooterHolder) viewHolder;
- footerHolder.numTv.setText("共" +mMp3InfoList.size()+ "首音乐");
+ footerHolder.numTv.setText("共" + mMp3InfoList.size() + "首音乐");
}
}
- //判断点击的是否为上一个点击的项目
+ // 判断点击的是否为上一个点击的项目
public void equalPosition(int position) {
if (position != mLastPosition) {
notifyItemChanged(mLastPosition);
@@ -130,17 +133,15 @@ public class SongAdapter extends RecyclerView.Adapter {
notifyItemChanged(position);
}
+ // 获取列表项的总数
@Override
public int getItemCount() {
- return mMp3InfoList.size() + 1;
+ return mMp3InfoList.size() + 1; // 加1是为了显示底部视图
}
+ // 获取列表项的视图类型
@Override
public int getItemViewType(int position) {
return position + 1 == getItemCount() ? footerViewType : itemViewType;
}
-
-
-
-
-}
+}
\ No newline at end of file
--
2.34.1
From 1c859d3c7dccd44fb07e3eee6c356749b2b715b8 Mon Sep 17 00:00:00 2001
From: px4lqzo5h <2148135761@qq.com>
Date: Mon, 16 Dec 2024 19:02:22 +0800
Subject: [PATCH 10/23] Update TabAdapter.java
---
.../musicplayer/adapter/TabAdapter.java | 23 +++++++++++--------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/adapter/TabAdapter.java b/app/src/main/java/com/example/musicplayer/adapter/TabAdapter.java
index 2bc27d9..4922390 100644
--- a/app/src/main/java/com/example/musicplayer/adapter/TabAdapter.java
+++ b/app/src/main/java/com/example/musicplayer/adapter/TabAdapter.java
@@ -1,5 +1,6 @@
package com.example.musicplayer.adapter;
+// 导入所需的包和类
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
@@ -7,31 +8,35 @@ import android.support.v4.app.FragmentPagerAdapter;
import java.util.List;
/**
+ * 顶部导航栏的适配器,用于为每个标签页提供对应的 Fragment。
* Created by 残渊 on 2018/11/25.
*/
-
public class TabAdapter extends FragmentPagerAdapter {
- private List mFragmentList;//顶部导航栏的内容即fragment
- private List mTitle;//顶部导航栏的标题
-
+ private List mFragmentList; // 顶部导航栏的内容,即 Fragment 列表
+ private List mTitle; // 顶部导航栏的标题列表
- public TabAdapter(FragmentManager fragmentManager, Listfragments, Listtitle){
+ // 构造函数,初始化 FragmentManager、Fragment 列表和标题列表
+ public TabAdapter(FragmentManager fragmentManager, List fragments, List title) {
super(fragmentManager);
- mFragmentList=fragments;
- mTitle=title;
-
+ mFragmentList = fragments;
+ mTitle = title;
}
+
+ // 获取指定位置的 Fragment
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
+ // 获取 Fragment 的总数
@Override
public int getCount() {
return mFragmentList.size();
}
+
+ // 获取指定位置的标题
@Override
public CharSequence getPageTitle(int position) {
return mTitle.get(position);
}
-}
+}
\ No newline at end of file
--
2.34.1
From 360b162e12e5e6706ca5683bf671bc7d737f2ff8 Mon Sep 17 00:00:00 2001
From: px4lqzo5h <2148135761@qq.com>
Date: Mon, 16 Dec 2024 19:03:54 +0800
Subject: [PATCH 11/23] Update Api.java
---
.../java/com/example/musicplayer/app/Api.java | 63 +++++++++----------
1 file changed, 31 insertions(+), 32 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/app/Api.java b/app/src/main/java/com/example/musicplayer/app/Api.java
index 802817a..79a43d7 100644
--- a/app/src/main/java/com/example/musicplayer/app/Api.java
+++ b/app/src/main/java/com/example/musicplayer/app/Api.java
@@ -3,42 +3,41 @@ package com.example.musicplayer.app;
import android.os.Environment;
/**
+ * 提供音乐播放器应用中使用的各类API接口地址和常量。
* Created by 残渊 on 2018/10/26.
*/
-
public class Api {
- //根据歌手获取歌手图片的baseUrl
- public static final String SINGER_PIC_BASE_URL ="http://music.163.com/";
- public static final String SINGER_PIC="api/search/get/web?csrf_token=&type=100";
- //获取歌手图片需要添加user-agent的表头
- public static final String HEADER_USER_AGENT="User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36";
+ // 根据歌手获取歌手图片的baseUrl
+ public static final String SINGER_PIC_BASE_URL = "http://music.163.com/";
+ public static final String SINGER_PIC = "api/search/get/web?csrf_token=&type=100";
+ // 获取歌手图片需要添加user-agent的表头
+ public static final String HEADER_USER_AGENT = "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36";
/**
- * 存取到手机内存的文件名
+ * 存储到手机内存的文件路径
*/
- public static String STORAGE_IMG_FILE= App.getContext().getExternalFilesDir("") + "/yuanmusic/img/";
- public static String STORAGE_LRC_FILE= App.getContext().getExternalFilesDir("") + "/yuanmusic/lrc/";
- public static String STORAGE_SONG_FILE= Environment.getExternalStorageDirectory() + "/Sxmusic/download/";
-
- //Fiddler抓包qq音乐网站后的地址
- public static final String FIDDLER_BASE_QQ_URL ="https://c.y.qq.com/";
- public static final String FIDDLER_BASE_SONG_URL="https://u.y.qq.com/"; //获取播放地址的baseUrl
- //搜索功能
- public static final String SEARCH_SONG ="soso/fcgi-bin/client_search_cp?n=30&format=json"; //歌曲,n为一页30首
- public static final String SEARCH_ALBUM="soso/fcgi-bin/client_search_cp?n=20&format=json&t=8";//专辑,n为一页20张
- //得到歌曲的播放地址
- public static final String SONG_URL="cgi-bin/musicu.fcg?format=json";
- public static final String SONG_URL_DATA_LEFT="%7B%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%22358840384%22%2C%22songmid%22%3A%5B%22";
- public static final String SONG_URL_DATA_RIGHT="%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%221443481947%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A%221443481947%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D";
- public static final String MP4 =".mp4";
- //专辑照片
- public static final String ALBUM_PIC="http://y.gtimg.cn/music/photo_new/T002R180x180M000";
- public static final String JPG=".jpg";
- //专辑详细
- public static final String ALBUM_DETAIL="v8/fcg-bin/fcg_v8_album_info_cp.fcg?format=json";
- //歌词
- public static final String SONG_LRC ="soso/fcgi-bin/client_search_cp?p=1&n=30&format=json&t=7";//搜索歌词
- public static final String ONLINE_SONG_LRC="https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?format=json&nobase64=1";//根据qq音乐的mid获取歌词
- public static final String HEADER_REFERER="Referer:https://y.qq.com/portal/player.html";//得到歌词需要添加Referer的表头
+ public static String STORAGE_IMG_FILE = App.getContext().getExternalFilesDir("") + "/yuanmusic/img/";
+ public static String STORAGE_LRC_FILE = App.getContext().getExternalFilesDir("") + "/yuanmusic/lrc/";
+ public static String STORAGE_SONG_FILE = Environment.getExternalStorageDirectory() + "/Sxmusic/download/";
-}
+ // Fiddler抓包qq音乐网站后的地址
+ public static final String FIDDLER_BASE_QQ_URL = "https://c.y.qq.com/";
+ public static final String FIDDLER_BASE_SONG_URL = "https://u.y.qq.com/"; // 获取播放地址的baseUrl
+ // 搜索功能
+ public static final String SEARCH_SONG = "soso/fcgi-bin/client_search_cp?n=30&format=json"; // 歌曲,n为一页30首
+ public static final String SEARCH_ALBUM = "soso/fcgi-bin/client_search_cp?n=20&format=json&t=8"; // 专辑,n为一页20张
+ // 得到歌曲的播放地址
+ public static final String SONG_URL = "cgi-bin/musicu.fcg?format=json";
+ public static final String SONG_URL_DATA_LEFT = "%7B%22req_0%22%3A%7B%22module%22%3A%22vkey.GetVkeyServer%22%2C%22method%22%3A%22CgiGetVkey%22%2C%22param%22%3A%7B%22guid%22%3A%22358840384%22%2C%22songmid%22%3A%5B%22";
+ public static final String SONG_URL_DATA_RIGHT = "%22%5D%2C%22songtype%22%3A%5B0%5D%2C%22uin%22%3A%221443481947%22%2C%22loginflag%22%3A1%2C%22platform%22%3A%2220%22%7D%7D%2C%22comm%22%3A%7B%22uin%22%3A%221443481947%22%2C%22format%22%3A%22json%22%2C%22ct%22%3A24%2C%22cv%22%3A0%7D%7D";
+ public static final String MP4 = ".mp4";
+ // 专辑照片
+ public static final String ALBUM_PIC = "http://y.gtimg.cn/music/photo_new/T002R180x180M000";
+ public static final String JPG = ".jpg";
+ // 专辑详细
+ public static final String ALBUM_DETAIL = "v8/fcg-bin/fcg_v8_album_info_cp.fcg?format=json";
+ // 歌词
+ public static final String SONG_LRC = "soso/fcgi-bin/client_search_cp?p=1&n=30&format=json&t=7"; // 搜索歌词
+ public static final String ONLINE_SONG_LRC = "https://c.y.qq.com/lyric/fcgi-bin/fcg_query_lyric_new.fcg?format=json&nobase64=1"; // 根据qq音乐的mid获取歌词
+ public static final String HEADER_REFERER = "Referer:https://y.qq.com/portal/player.html"; // 得到歌词需要添加Referer的表头
+}
\ No newline at end of file
--
2.34.1
From 3f9d46f959b611ebd5885e2544fd0964b904fc10 Mon Sep 17 00:00:00 2001
From: px4lqzo5h <2148135761@qq.com>
Date: Mon, 16 Dec 2024 19:05:33 +0800
Subject: [PATCH 12/23] Update App.java
---
.../java/com/example/musicplayer/app/App.java | 27 ++++++++++++-------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/app/App.java b/app/src/main/java/com/example/musicplayer/app/App.java
index 275a7d8..df87203 100644
--- a/app/src/main/java/com/example/musicplayer/app/App.java
+++ b/app/src/main/java/com/example/musicplayer/app/App.java
@@ -1,5 +1,6 @@
package com.example.musicplayer.app;
+// 导入所需的包和类
import android.annotation.SuppressLint;
import android.app.Application;
import android.content.Context;
@@ -7,22 +8,30 @@ import android.content.Context;
import org.litepal.LitePal;
/**
- * 获取全局Context
+ * 应用全局上下文类,用于获取全局Context实例。
+ *
* Created by 残渊 on 2018/7/17.
*/
-
public class App extends Application {
+ // 使用SuppressLint注解来抑制静态字段可能引起的内存泄漏警告
@SuppressLint("StaticFieldLeak")
- private static Context context;
+ private static Context context; // 静态变量,用于存储全局Context对象
+ /**
+ * 在应用创建时初始化全局Context和LitePal数据库。
+ */
@Override
- public void onCreate(){
- super.onCreate();
- context=getApplicationContext();
- LitePal.initialize(this);
+ public void onCreate() {
+ super.onCreate(); // 调用父类的onCreate方法
+ context = getApplicationContext(); // 初始化全局Context对象
+ LitePal.initialize(this); // 初始化LitePal数据库
}
- public static Context getContext(){
+ /**
+ * 提供全局Context对象的获取方法。
+ * @return 返回全局Context对象
+ */
+ public static Context getContext() {
return context;
}
-}
+}
\ No newline at end of file
--
2.34.1
From f7cd60a5386bab4e98e587de52d71bb13d2f9540 Mon Sep 17 00:00:00 2001
From: px4lqzo5h <2148135761@qq.com>
Date: Mon, 16 Dec 2024 19:08:02 +0800
Subject: [PATCH 13/23] Update Constant.java
---
.../com/example/musicplayer/app/Constant.java | 62 +++++++++----------
1 file changed, 31 insertions(+), 31 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/app/Constant.java b/app/src/main/java/com/example/musicplayer/app/Constant.java
index 2c7b0db..e0cfaf0 100644
--- a/app/src/main/java/com/example/musicplayer/app/Constant.java
+++ b/app/src/main/java/com/example/musicplayer/app/Constant.java
@@ -1,82 +1,82 @@
package com.example.musicplayer.app;
/**
+ * 定义应用中使用的常量类。
* Created by 残渊 on 2018/11/23.
*/
-
public class Constant {
+ // 日志标签
public static final String TAG = "jsyjst";
+ // 分页加载的偏移量
public static final int OFFSET = 30;
+ // 类型常量,用于区分歌曲和专辑
public static final int TYPE_SONG = 1;
public static final int TYPE_ALBUM = 2;
- //播放列表
- public static final int LIST_TYPE_LOCAL = 1; //本地列表
- public static final int LIST_TYPE_ONLINE = 2; //专辑列表
- public static final int LIST_TYPE_LOVE = 3; //我的收藏列表
- public static final int LIST_TYPE_HISTORY = 4; //最近播放列表
- public static final int LIST_TYPE_DOWNLOAD = 5; //下载列表
+ // 播放列表类型
+ public static final int LIST_TYPE_LOCAL = 1; // 本地列表
+ public static final int LIST_TYPE_ONLINE = 2; // 专辑列表
+ public static final int LIST_TYPE_LOVE = 3; // 我的收藏列表
+ public static final int LIST_TYPE_HISTORY = 4; // 最近播放列表
+ public static final int LIST_TYPE_DOWNLOAD = 5; // 下载列表
+ // 搜索历史最大条目数
public static final int HISTORY_MAX_SIZE = 100;
-
- //布局
+ // 布局状态常量
public static final int NORMAL_STATE = 0;
public static final int LOADING_STATE = 1;
public static final int ERROR_STATE = 2;
- //playerStatus
+ // 播放器状态常量
public static final String PLAYER_STATUS = "PlayerStatus";
public static final int SONG_PLAY = 0;
public static final int SONG_PAUSE = 1;
public static final int SONG_RESUME = 2;
public static final int SONG_CHANGE = 3;
-
- //KEY
+ // 键值对常量
public static final String ALBUM_ID_KEY = "id";
public static final String ALBUM_NAME_KEY = "albumName";
public static final String SINGER_NAME_KEY = "singerName";
public static final String ALBUM_PIC_KEY = "albumPic";
public static final String PUBLIC_TIME_KEY = "publicTime";
-
- //TAG
+ // 错误标签
public static final String TAG_ERROR = "error";
- //网络与非网络歌曲
+ // 网络与非网络歌曲标识
public static final int SONG_ONLINE = 0;
public static final int SONG_LOCAL = 1;
-
- //后缀
+ // 后缀常量
public static final String LRC = ".lrc";
- //音乐id
+ // 音乐id未找到标识
public static final String SONG_ID_UNFIND = "unFind";
- //播放顺序
- public static final int PLAY_ORDER = 0;//顺序播放
- public static final int PLAY_SINGLE = 1;//单曲循环
- public static final int PLAY_RANDOM = 2;//随机播放
+ // 播放顺序常量
+ public static final int PLAY_ORDER = 0; // 顺序播放
+ public static final int PLAY_SINGLE = 1; // 单曲循环
+ public static final int PLAY_RANDOM = 2; // 随机播放
- //Preferences
+ // Preferences常量
public static final String SHARED_PREFERENCES_NAME = "prefs";
- public static final String PREFS_PLAY_MODE = "play_mode";//播放状态
+ public static final String PREFS_PLAY_MODE = "play_mode"; // 播放模式
- //download
+ // 下载状态常量
public final static int TYPE_DOWNLOADING = 0;
public final static int TYPE_DOWNLOAD_PAUSED = 1;
public final static int TYPE_DOWNLOAD_CANCELED = 2;
public final static int TYPE_DOWNLOAD_SUCCESS = 3;
public final static int TYPE_DOWNLOAD_FAILED = 4;
public final static int TYPE_DOWNLOADED = 5;
- public final static int TYPE_DOWNLOAD_ADD=6;
+ public final static int TYPE_DOWNLOAD_ADD = 6;
- //正在下载歌曲列表的状态
+ // 正在下载歌曲列表的状态常量
public final static int DOWNLOAD_PAUSED = 0;
- public final static int DOWNLOAD_WAIT=1;
- public final static int DOWNLOAD_ING=2;
- public final static int DOWNLOAD_READY=3;
-}
+ public final static int DOWNLOAD_WAIT = 1;
+ public final static int DOWNLOAD_ING = 2;
+ public final static int DOWNLOAD_READY = 3;
+}
\ No newline at end of file
--
2.34.1
From 33250edf2b6d09885ab65bc59dbe8863bc9302d0 Mon Sep 17 00:00:00 2001
From: px4lqzo5h <2148135761@qq.com>
Date: Mon, 16 Dec 2024 19:11:53 +0800
Subject: [PATCH 14/23] Update BaseActivity.java
---
.../base/activity/BaseActivity.java | 50 +++++++++++--------
1 file changed, 28 insertions(+), 22 deletions(-)
diff --git a/app/src/main/java/com/example/musicplayer/base/activity/BaseActivity.java b/app/src/main/java/com/example/musicplayer/base/activity/BaseActivity.java
index 9e80550..5a18314 100644
--- a/app/src/main/java/com/example/musicplayer/base/activity/BaseActivity.java
+++ b/app/src/main/java/com/example/musicplayer/base/activity/BaseActivity.java
@@ -1,5 +1,6 @@
package com.example.musicplayer.base.activity;
+// 导入所需的包和类
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
@@ -12,63 +13,68 @@ import butterknife.ButterKnife;
import butterknife.Unbinder;
/**
- *