Android音乐播放器4.0(播放准备)

235 阅读2分钟

这是我参与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 来实现播放