这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战
这一节我们需要实现播放歌曲的功能。想要实现播放歌曲,需要得到歌曲的 url 地址。由于上一节的接口中我们得到的歌曲列表中并没有歌曲地址,所以我们需要根据 song_id 再次发送请求,获取歌曲 url,使用接口:网易云歌曲支链
1、修改 UrlFactory,增加
public static String getMusicUrl(String id) {
String url = "https://v2.alapi.cn/api/music/url?token=注册网站用户中心获取token&format=json&id=" + id;
return url;
}
2、MusicModel 中增加根据 songid 获取歌链接的方法
/**
* 根据songid异步记载这首歌的其他信息
*
* @param songid
* @param callback
*/
public void loadMusicInfoBySongId(final String songid, final MusicInfoCallback callback) {
AsyncTask<String, String, MusicItem> task = new AsyncTask<String, String, MusicItem>() {
//工作线程中发送请求 获取基本信息
@Override
protected MusicItem doInBackground(String... strings) {
try {
InputStream is = HttpUtils.getInputStream(UrlFactory.getMusicUrl(songid));
String json = HttpUtils.isToString(is);
Log.d("info", json);
JSONObject object = new JSONObject(json);
JSONObject songInfo = object.getJSONObject("data");
String url = songInfo.getString("url");
MusicItem music = new MusicItem();
music.url = url;
//把music交给onPostExecute
return music;
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(MusicItem music) {
if (music == null) {
callback.onMusicInfoLoaded(null);
} else {
//从上面传来的music
callback.onMusicInfoLoaded(music);
}
}
};
task.execute();
}
增加接口:MusicInfoCallback
public interface MusicInfoCallback {
/**
* 当音乐信息加载完成将会执行该方法
*/
void onMusicInfoLoaded(MusicItem musicItem);
}
由于增加了歌曲链接,所以在 MusicItem 中增加 url 字段
public class MusicItem {
public String id;
public String name;
public String albumName;
public String albumPic;
public String url;
public AlbumModel al;
}
NewMusicListFragment 中给 ListView 添加点击事件
public class NewMusicListFragment extends Fragment {
private ListView listView;
private MusicAdapter adapter;
private List<Music> musics;
private MusicModel model = new MusicModel();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_music_list,null);
setViews(view);
setListeners();
......
return view;
}
private void setListeners() {
listView.setOnItemClickListener((adapterView, view, i, l) -> {
final MusicItem music = musics.get(i);
String songId = music.id;
Toast.makeText(getActivity(),"position:"+i,Toast.LENGTH_SHORT).show();
//执行业务层 加载这首歌曲的基本信息
model.loadMusicInfoBySongId(songId, new MusicInfoCallback() {
@Override
public void onMusicInfoLoaded(MusicItem musicItem) {
music.url = musicItem.url;
//准备通过url地址执行播放业务
}
});
});
}
......
}
到此为止我们获取了要播放歌曲的 url,下一节中根据 url 来实现播放