实现功能:
实现网络音乐搜索功能
实现网络音乐下载功能
下载好的音乐目前不在播放器内,可以通过文件浏览器查看。
后续将博文,将实现歌词和下载音乐扫描功能。

经过将近4天,才发布这一篇博客,明显更新博客速度变慢了,因为没有自己的音乐服务器,网络上的音乐网站在这边博客发表的2016年5月已经很难找到免费且在线下载的了,就算找到解析也是一个难题。如果你在练习同样功能的Demo,请尽快下载练习,因为博主也无法保证我Demo下载功能时效性,因为我解析的音乐网站可能分分钟修改网页源码!!!

截止到目前的源码下载:
http://download.csdn.net/album/detail/3105
(最新的,请下载最后一个;如果需要逐步实现的过程,请下载所有)

欢迎移动开发爱好者交流:我的微信是iwanghang

另外,我打算开始找工作,如果沈阳或周边城市公司有意,也请与我联系。

实现效果如图:

实现代码如下:
NetMusicListFragment如下:

package com.iwanghang.drmplayer;import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;import com.iwanghang.drmplayer.adapter.NetMusicListAdapter;
import com.iwanghang.drmplayer.utils.AppUtils;
import com.iwanghang.drmplayer.utils.Constant;
import com.iwanghang.drmplayer.utils.SearchMusicUtils;
import com.iwanghang.drmplayer.vo.SearchResult;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.IOException;
import java.util.ArrayList;public class NetMusicListFragment extends Fragment implements OnItemClickListener,OnClickListener {private ListView listView_net_music;private LinearLayout load_layout;private LinearLayout ll_search_btn_container;//查询按钮的容器private LinearLayout ll_search_container;//查询按钮的容器private ImageButton ib_search_btn;private EditText et_search_content;private NetMusicListAdapter netMusicListAdapter;//存放 网络音乐 的集合private ArrayList<SearchResult> searchResults = new ArrayList<SearchResult>();private int page = 1;//搜索音乐的页码private MainActivity mainActivity;//private boolean isPause = false;//歌曲播放中的暂停状态private int position = 0;//当前播放的位置,提供给PlayActivity//onAttach(),当fragment被绑定到activity时被调用(Activity会被传入.).@Overridepublic void onAttach(Context context) {super.onAttach(context);//mainActivity = (MainActivity) context;mainActivity = (MainActivity) getActivity();}public static NetMusicListFragment newInstance() {NetMusicListFragment net = new NetMusicListFragment();return net;}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {//UI组件初始化View view = inflater.inflate(R.layout.net_music_list_layout,null);//itemlistView_net_music = (ListView) view.findViewById(R.id.listView_net_music);//findViewByIdload_layout = (LinearLayout) view.findViewById(R.id.load_layout);ll_search_btn_container = (LinearLayout) view.findViewById(R.id.ll_search_btn_container);ll_search_container = (LinearLayout) view.findViewById(R.id.ll_search_container);ib_search_btn = (ImageButton) view.findViewById(R.id.ib_search_btn);et_search_content = (EditText) view.findViewById(R.id.et_search_content);//Item点击事件监听listView_net_music.setOnItemClickListener(this);//按钮点击事件监听ll_search_btn_container.setOnClickListener(this);ib_search_btn.setOnClickListener(this);loadNetData();//加载网络音乐return view;}private void loadNetData() {load_layout.setVisibility(View.VISIBLE);//加载网络音乐的异步任务new LoadNetDataTask().execute(Constant.MIGU_CHINA);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.ll_search_btn_container:ll_search_btn_container.setVisibility(View.GONE);ll_search_container.setVisibility(View.VISIBLE);break;case R.id.ib_search_btn://搜索事件searchMusic();break;}}//搜索音乐private void searchMusic() {//隐藏键盘AppUtils.hideInputMethod(et_search_content);ll_search_btn_container.setVisibility(View.VISIBLE);ll_search_container.setVisibility(View.GONE);//获取输入的文字String key = et_search_content.getText().toString();if (TextUtils.isEmpty(key)){//如果为空,则,Toast提示Toast.makeText(mainActivity,"请输入歌手或歌词",Toast.LENGTH_SHORT).show();return;}load_layout.setVisibility(View.VISIBLE);//加载layout效果.显示//填充item 使用SearchMusicUtils搜索音乐工具类,并,使用观察者设计模式,自己回调,自己监听SearchMusicUtils.getInstance().setListener(new SearchMusicUtils.OnSearchResultListener(){@Overridepublic void onSearchResult(ArrayList<SearchResult> results) {ArrayList<SearchResult> sr = netMusicListAdapter.getSearchResults();sr.clear();sr.addAll(results);netMusicListAdapter.notifyDataSetChanged();//更新网络音乐列表load_layout.setVisibility(View.GONE);}}).search(key,page);}//列表项的单击事件@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if (position >= netMusicListAdapter.getSearchResults().size() || position < 0) return;showDownloadDialog(position);}//下载弹窗private void showDownloadDialog(final int position){DownloadDialogFragment downloadDialogFragment = DownloadDialogFragment.newInstance(searchResults.get(position));downloadDialogFragment.show(getFragmentManager(),"download");}//加载网络音乐的异步任务//Android1.5提供了 工具类 android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。class LoadNetDataTask extends AsyncTask<String,Integer,Integer>{//onPreExecute方法用于在执行后台任务前做一些UI操作@Overrideprotected void onPreExecute() {super.onPreExecute();load_layout.setVisibility(View.VISIBLE);//加载layout.显示listView_net_music.setVisibility(View.GONE);//item.隐藏searchResults.clear();//搜索结果.清理}//doInBackground方法内部执行后台任务,不可在此方法内修改UI@Overrideprotected Integer doInBackground(String... params) {String url = params[0];try {//使用Jsoup组件请求网络,并解析音乐数据Document doc = Jsoup.connect(url).userAgent(Constant.USER_AGENT).timeout(6000).get();System.out.println("start**********doc**********doc**********doc**********");System.out.println(doc);System.out.println(" end **********doc**********doc**********doc**********");//从doc分析以上html代码;把所有span标签下fl song_name查找出来,存在songTitles集合中;即,歌名集合;//从doc分析以上html代码;把所有span标签下fl singer_name.mr5t查找出来,存在artists集合中;即,歌手集合;Elements songTitles = doc.select("span.fl.song_name");System.out.println(songTitles);Elements artists = doc.select("span.fl.singer_name.mr5");System.out.println(artists);for (int i=0;i<songTitles.size();i++){SearchResult searchResult = new SearchResult();//a链接,存在urls集合中;即,歌曲url集合;//a链接,第一个a连接,href属性的值;即,最终的url;//a链接,第一个a连接,text(a链接的内容,例:>半壶纱<,半壶纱就是a链接的内容);即,最终的歌名;Elements urls = songTitles.get(i).getElementsByTag("a");//System.out.println("@urls : " + urls);searchResult.setUrl(urls.get(0).attr("href"));//设置最终的urlsearchResult.setMusicName(urls.get(0).text());//设置最终的歌名//a链接,存在urls集合中;即,歌曲url集合;Elements artistElements = artists.get(i).getElementsByTag("a");//System.out.println("@artistElements : " + artistElements);searchResult.setArtist(artistElements.get(0).text());//设置最终的歌手searchResult.setAlbum("华语榜");//设置最终的专辑System.out.println("@searchResult : " + searchResult);searchResults.add(searchResult);//把最终的所有信息,添加到集合}System.out.println("@searchResults : " + searchResults);//System.out.println("@songTitles.size() : " + searchResults.size());} catch (IOException e) {e.printStackTrace();return -1;}return 1;}//onPostExecute方法用于在执行完后台任务后更新UI,显示结果@Overrideprotected void onPostExecute(Integer result) {super.onPostExecute(result);if (result==1){netMusicListAdapter = new NetMusicListAdapter(mainActivity,searchResults);//System.out.println(searchResults);listView_net_music.setAdapter(netMusicListAdapter);listView_net_music.addFooterView(LayoutInflater.from(mainActivity).inflate(R.layout.footviwe_layout,null));}load_layout.setVisibility(View.GONE);listView_net_music.setVisibility(View.VISIBLE);}}}

DownloadDialogFragment如下:

package com.iwanghang.drmplayer;import android.app.AlertDialog;
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;import com.iwanghang.drmplayer.utils.DownloadUtils;
import com.iwanghang.drmplayer.vo.SearchResult;/*** Created by iwanghang on 16/5/3.* DownloadDialogFargment*/
public class DownloadDialogFragment extends DialogFragment {private SearchResult searchResult;//当前要下载的歌曲对象private MainActivity mainActivity;public static DownloadDialogFragment newInstance(SearchResult searchResult){DownloadDialogFragment downloadDialogFragment = new DownloadDialogFragment();downloadDialogFragment.searchResult = searchResult;return downloadDialogFragment;}private String[] items;@Overridepublic void onAttach(Context context) {super.onAttach(context);mainActivity = (MainActivity) getActivity();//items = new String[]{"下载","取消"};items = new String[]{getString(R.string.download),getString(R.string.cancel)};}//创建对话框的事件方法@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {final AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity);builder.setCancelable(true);//返回键可以取消builder.setItems(items,new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case 0://执行下载downloadMusic();break;case 1://取消dialog.dismiss();break;}}});return builder.show();}//下载音乐private void downloadMusic() {Toast.makeText(mainActivity, "正在下载:" + searchResult.getMusicName(), Toast.LENGTH_SHORT).show();DownloadUtils.getsInstance().setListener(new DownloadUtils.OnDownloadListener() {@Overridepublic void onDowload(String mp3Url) { //下载成功Toast.makeText(mainActivity, "下载成功", Toast.LENGTH_SHORT).show();}@Overridepublic void onFailed(String error) { //下载失败Toast.makeText(mainActivity, error, Toast.LENGTH_SHORT).show();}}).download(searchResult);}}

DownloadUtils如下:

package com.iwanghang.drmplayer.utils;import android.os.Environment;
import android.os.Handler;
import android.os.Message;import com.iwanghang.drmplayer.vo.SearchResult;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import javax.xml.parsers.ParserConfigurationException;/*** Created by iwanghang on 16/5/3.* 网络音乐下载工具类*/
public class DownloadUtils {private static final String DOWNLOAD_URL = "/download?_o=%2Fsearch%2Fsong";private static final int SUCCESS_LRC = 1;//下载歌词成功private static final int FAILED_LRC = 2;//下载歌词失败private static final int SUCCESS_MP3 = 3;//下载歌曲成功private static final int FAILED_MP3 = 4;//下载歌曲失败private static final int GET_MP3_URL = 5;//获取音乐下载地址成功private static final int GET_FAILED_MP3_URL = 6;//获取音乐下载地址失败private static final int MUSIC_EXISTS = 7;//下载时,音乐已存在private static DownloadUtils sInstance;private OnDownloadListener mListener;private ExecutorService mThreadPool;/***设置回调监听器对象* @param mListener* @return*/public DownloadUtils setListener(OnDownloadListener mListener){this.mListener = mListener;return this;}//获取下载工具的实例public synchronized static DownloadUtils getsInstance(){if (sInstance == null){try {sInstance = new DownloadUtils();} catch (ParserConfigurationException e) {e.printStackTrace();}}return  sInstance;}/*** 下载的具体业务方法* @throws ParserConfigurationException*/private DownloadUtils() throws ParserConfigurationException{mThreadPool = Executors.newSingleThreadExecutor();}public void download(final SearchResult searchResult){final Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case SUCCESS_LRC:if (mListener != null) mListener.onDowload("歌词下载成功");break;case FAILED_LRC:if (mListener != null) mListener.onFailed("歌词下载失败");break;case GET_MP3_URL:System.out.println("GET_MP3_URL:"+msg.obj);downloadMusic(searchResult,(String)msg.obj,this);break;case GET_FAILED_MP3_URL:if (mListener != null) mListener.onFailed("下载失败,该歌曲为收费或VIP类型");break;case SUCCESS_MP3:if (mListener != null) mListener.onDowload(searchResult.getMusicName()+"已经下载");String url = Constant.MIGU_URL + searchResult.getUrl();System.out.println("download lrc:"+url);downloadLRC(url,searchResult.getMusicName(),this);break;case FAILED_MP3:if (mListener != null) mListener.onFailed(searchResult.getMusicName()+"下载失败");break;case MUSIC_EXISTS:if (mListener != null) mListener.onFailed("音乐已存在");break;}}};getDownloadMusicURL(searchResult,handler);}//获取下载音乐的URLprivate void getDownloadMusicURL(final SearchResult searchResult, final Handler handler) {mThreadPool.execute(new Runnable() {@Overridepublic void run() {//http://music.xxxx.cn/#/album/1003215276//1003215279//http://music.xxxx.cn/order/1003215279/down/self/P2Z3Y12L1N2/3/001002A/1003215279System.out.println("searchResult.getUrl() = " + searchResult.getUrl());String[] aa = searchResult.getUrl().split("/");String sn = aa[5];System.out.println("歌曲编号 = " + sn);String url = Constant.MIGU_DOWN_HEAD + sn + Constant.MIGU_DOWN_FOOT;System.out.println("下载页面url = " + url);try {Document doc = Jsoup.connect(url).userAgent(Constant.USER_AGENT).timeout(6000).get();//System.out.println(doc);System.out.println("doc.toString() = " + doc.toString());String[] bb = doc.toString().split("song");//把 下载页面源码 按照"song"分割for (int i=0;i<bb.length;i++){System.out.println("bb[" + i + "] = " + bb[i]);if (bb[i].indexOf("mp3?msisdn")>0){System.out.println("mp3?msisdn = " + bb[i]);String initMp3Url = bb[i];//initMp3Url 初始Mp3下载链接,如下//mp3?msisdn = ":"http://tyst.xxxx.cn/public/ringmaker01/10月31日中文延期/文件/全套格式/9000首/全曲试听/Mp3_128_44_16/一起走过的日子-刘德华.mp3?msisdn\u003d7b609763f0ff","String[] arrayHttp = initMp3Url.split("http");//把 初始Mp3下载链接 按照"http"分割String[] arrayMp3 = arrayHttp[1].split(".mp3");//把 arrayHttp 按照".mp3"分割String result = "http" + arrayMp3[0] + ".mp3";//把分割去掉的"http"和".mp3",组合回来System.out.println("result");//String result = "http://tyst.xxxx<span id="transmark"></span>.cn/public/ringmaker01/10月31日中文延期/文件/全套格式/9000首/全曲试听/Mp3_128_44_16/一起走过的日子-刘德华.mp3";Message msg = handler.obtainMessage(GET_MP3_URL,result);msg.sendToTarget();}}} catch (IOException e) {e.printStackTrace();handler.obtainMessage(GET_FAILED_MP3_URL).sendToTarget();}}});}//下载歌词private void downloadLRC(final String url, final String musicName,final Handler handler){mThreadPool.execute(new Runnable() {@Overridepublic void run() {try {Document doc = Jsoup.connect(url).userAgent(Constant.USER_AGENT).timeout(6000).get();Elements lrcTag = doc.select("div.lyric-content");String lrcURL = lrcTag.attr("data-lrclink");//System.out.println(lrcURL);File lrcDirFile = new File(Environment.getExternalStorageDirectory() + Constant.DIR_LRC);if (!lrcDirFile.exists()){lrcDirFile.mkdirs();}lrcURL = Constant.MIGU_URL + lrcURL;String target = lrcDirFile + "/" + musicName + ".lrc";OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(lrcURL).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()){PrintStream ps = new PrintStream(new File(target));byte[] bytes = response.body().bytes();ps.write(bytes,0,bytes.length);ps.close();handler.obtainMessage(SUCCESS_LRC,target).sendToTarget();}}catch (IOException e){e.printStackTrace();handler.obtainMessage(FAILED_LRC).sendToTarget();}} catch (IOException e) {e.printStackTrace();}}});}//下载MP3private void downloadMusic(final SearchResult searchResult,final String url,final Handler handler){mThreadPool.execute(new Runnable() {@Overridepublic void run() {File musicDirFile = new File(Environment.getExternalStorageDirectory()+Constant.DIR_MUSIC);if (!musicDirFile.exists()){musicDirFile.mkdirs();}String mp3url = url;String target = musicDirFile + "/" + searchResult.getMusicName() + ".mp3";System.out.println(mp3url);System.out.println(target);File fileTarget = new File(target);if (fileTarget.exists()){handler.obtainMessage(MUSIC_EXISTS).sendToTarget();return;}else {//使用OkHttpClient组件OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url(mp3url).build();System.out.println(request);try {Response response = client.newCall(request).execute();if (response.isSuccessful()){PrintStream ps = new PrintStream(fileTarget);byte[] bytes = response.body().bytes();ps.write(bytes,0,bytes.length);ps.close();handler.obtainMessage(SUCCESS_MP3).sendToTarget();}} catch (IOException e) {e.printStackTrace();handler.obtainMessage(FAILED_MP3).sendToTarget();}}}});}//自定义下载事件监听器public interface OnDownloadListener {public void onDowload(String mp3Url);public void onFailed(String error);}
}

SearchMusicUtils如下:

package com.iwanghang.drmplayer.utils;import android.os.Handler;
import android.os.Message;import com.iwanghang.drmplayer.vo.SearchResult;import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import javax.xml.parsers.ParserConfigurationException;/*** Created by iwanghang on 16/4/30.* 搜索音乐工具类*/
public class SearchMusicUtils {private static final int SIZE = 20;//查询歌曲数量//private static final String URL = Constant.BAIDU_URL + Constant.BAIDU_SEARCH;//private static String URL = Constant.BAIDU_URL + Constant.BAIDU_SEARCH;private static SearchMusicUtils sInstance;private OnSearchResultListener mListener;private ExecutorService mThreadPool;//线程池public synchronized static SearchMusicUtils getInstance(){if (sInstance == null){try {sInstance = new SearchMusicUtils();} catch (ParserConfigurationException e) {e.printStackTrace();}}return sInstance;}//设置搜索事件private SearchMusicUtils() throws ParserConfigurationException{mThreadPool = Executors.newSingleThreadExecutor();//单任务线程池}public SearchMusicUtils setListener(OnSearchResultListener l){mListener = l;return this;}public void search(final String key,final int page){final Handler handler = new Handler(){//handler 用于返回数据@Overridepublic void handleMessage(Message msg) {switch (msg.what){case Constant.SUCCESS:if (mListener != null) mListener.onSearchResult((ArrayList<SearchResult>)msg.obj);break;case Constant.FAILED:if (mListener != null) mListener.onSearchResult(null);break;}}};//执行线程mThreadPool.execute(new Runnable() {@Overridepublic void run() {//run方法ArrayList<SearchResult> results = getMusicList(key,page);if(results == null){handler.sendEmptyMessage(Constant.FAILED);return;}handler.obtainMessage(Constant.SUCCESS,results).sendToTarget();}});}//使用Jsoup组件请求网络,并解析音乐数据private ArrayList<SearchResult> getMusicList(final String key,final int page){final String start = String.valueOf((page - 1) * SIZE);ArrayList<SearchResult> searchResults = new ArrayList<SearchResult>();Document doc = null;String URL = null;try {//经过测试 获取页面 如果key不转码 无法打开正确连接//使用URLEncoder.encode转码,转为utf8//冰雨 转换为 %E6%B2%A1%E6%9C%89";String keyUrlEnCode = URLEncoder.encode(key, "utf8");URL = Constant.MIGU_SEARCH_HEAD + keyUrlEnCode +  Constant.MIGU_SEARCH_FOOT;System.out.println(URL);doc = Jsoup.connect(URL).data("query", "Java").userAgent(Constant.USER_AGENT).timeout(60 * 1000).get();//System.out.println("~~doc = " + doc);Elements songTitles = doc.select("span.fl.song_name");System.out.println(songTitles);Elements artists = doc.select("span.fl.singer_name.mr5");System.out.println(artists);for (int i=0;i<songTitles.size();i++){SearchResult searchResult = new SearchResult();//System.out.println("@searchResult : " + searchResult);//<a href="/song/121353608"//<a href="/song/264506450"//a链接,存在urls集合中;即,歌曲url集合;//a链接,第一个a连接,href属性的值;即,最终的url;//a链接,第一个a连接,text(a链接的内容,例:>半壶纱<,半壶纱就是a链接的内容);即,最终的歌名;Elements urls = songTitles.get(i).getElementsByTag("a");//System.out.println("@urls : " + urls);searchResult.setUrl(urls.get(0).attr("href"));//设置最终的urlsearchResult.setMusicName(urls.get(0).text());//设置最终的歌名//a链接,存在urls集合中;即,歌曲url集合;Elements artistElements = artists.get(i).getElementsByTag("a");//System.out.println("@artistElements : " + artistElements);searchResult.setArtist(artistElements.get(0).text());//设置最终的歌手searchResult.setAlbum("华语榜");//设置最终的专辑System.out.println("@searchResult : " + searchResult);searchResults.add(searchResult);//把最终的所有信息,添加到集合}System.out.println("@searchResults : " + searchResults);return searchResults;} catch (IOException e) {e.printStackTrace();}return null;}public interface OnSearchResultListener {public void onSearchResult(ArrayList<SearchResult> results);}}

Android开发本地及网络Mp3音乐播放器(十四)网络音乐下载功能实现相关推荐

  1. Android音乐播放器(四)音乐唱片的转盘,歌曲同步进度条,以及音乐的暂停/播放/继续/上下歌曲切换

    这是去年大二做的一个简单音乐播放器项目:是尽可能模仿酷狗音乐写的,具体实现的功能如下: 1:启动动画:点击运行程序会出现一个两秒钟的视频,类似酷狗音乐的启动动画一样,非常可观! 2:登录注册界面:输入 ...

  2. Android开发本地及网络Mp3音乐播放器(十五)网络音乐及歌词下载功能实现

    实现功能: 实现网络音乐歌词下载功能(下载音乐的同时,下载对应歌词) 下载好的歌词目前不在播放器内,可以通过文件浏览器查看. 后续将博文,将实现本地音乐歌词下载和已下载音乐扫描功能. 因为,没有自己的 ...

  3. Android开发本地及网络Mp3音乐播放器(十二)创建NetMusicListAdapter、SearchResult显示网络音乐列表

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51290181 觉得博文有用,请点赞,请留言,请关注,谢谢!~ 实现功能: 实现NetM ...

  4. android 音乐播放器ui界面设计音乐播放器毕业设计。Android studio编译,项目有源码和apk

    使用Android Studio开发一个简易的音乐播放器 界面图: 视频展示: android 音乐播放器ui界面设计音乐播放器毕业设计.Android studio编译 项目下载: android音 ...

  5. python3GUI--打造一款音乐播放器By:PyQt5(附下载地址)

    文章目录 一.准备工作 1.PyQt5 2.qtawesome 二.预览 1.启动 2.歌曲搜索 3.歌曲播放 4.评论查看 5.自定义背景 6.设置-基本设置 7.设置-高级设置 8.定时任务 三. ...

  6. java课程设计-音乐播放器,基于java的音乐播放器设计.doc

    摘要:音乐是生活的必需的,它能够缓解人们焦躁的心情,调节现代化生活的节奏,让人们能够舒缓身心.一个好的音乐播放器,能够实现个性化的功能,它能够根据个人的喜好来推荐歌曲.深流音乐播放器正是实现了此功能, ...

  7. 计算机音乐播放器功能,一个超级漂亮的音乐播放器!尤其是音频可视化功能

    用于Android的音乐播放器,它使用Visualzer Class呈现当前正在播放的音乐的精美DNA(可视化). 超级漂亮的音乐播放器!尤其是音频可视化功能 用于Android的音乐播放器,它使用V ...

  8. 开源音乐播放器_使用开源音乐播放器设计生活中的配乐

    开源音乐播放器 我们围绕着自己的个人配乐. 我们的音乐让我们想起了人生中最重要的时刻,并帮助我们塑造了自己的感受和看法. 让音乐播放器支持自由选择音乐的播放方式,同时又不影响播放质量非常重要,而且我一 ...

  9. 单片机音乐播放器课程设计C语言,单片机音乐播放器课程设计中音乐代码怎么弄...

    单片机音乐播放器课程设计中音乐代码怎么弄 答案:2  信息版本:手机版 解决时间 2019-10-06 13:16 已解决 2019-10-06 02:07 单片机音乐播放器课程设计中音乐代码怎么弄 ...

最新文章

  1. moment获取几小时前_momentjs – 使用时刻在两个日期时间之间获得hh:mm的时差
  2. 〈转贴〉如何解决 Windows XP 中的硬件和软件驱动程序问题
  3. struts2开发action 的三种方法以及通配符、路径匹配原则、常量
  4. ASP.NET会员注册登录模块(MD5加密,Parameters防止SQL注入,判断是否注册)
  5. lvs服务器需要开启web服务么_Centos7搭建LVS+Keepalived高可用Web
  6. OJ1063: 最大公约与最小公倍(C语言)
  7. java+串行和并行的区别_Java8新特性_并行流与串行流
  8. Atitit 高并发设计实践 艾提拉著 目录 1. 并发的实现俩中模式 并发角度来看 基于事件触发vs线程的 1 2. 负载均衡 1 2.1. 云服务模型paas caas faas+http
  9. Linux虚拟机远程连接工具
  10. 数字图像算术编码python_算术编码简介
  11. 二十款免费WiFi渗透工具
  12. Alexa 智能音箱开发智能家居
  13. SQL 字符串去除空格函数
  14. php5 ereg,ereg / eregi替代PHP 5.3
  15. java学生成绩分90及格_Java基础练习:题目:利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示。 - 菜鸟头头...
  16. 君不密则失臣,臣不密则失身,机事不密则害成
  17. 前端企业级的开源项目
  18. web系统中的结构化数据标记
  19. 学计算机专业还是数学专业课,数学专业的数学和计算机专业的数学的比较.doc...
  20. 此计算机无法与域 cluster,创建0xc000005e群集时出现错误 - Windows Server | Microsoft Docs...

热门文章

  1. 计算机课给别人交作业检讨书,没交作业检讨书500字范文
  2. 2019/6/30,道歉书
  3. 什么是高新技术企业,高新企业的意思
  4. 间隔时间Delta T和时间总长的计算方法
  5. 20191203—— 机器学习复习 sklearn转换器与预估器
  6. Android自定义控件(二)——支付宝支付成功动画
  7. python国内阿里下载源
  8. Verilog学习之数据常量表达与位宽
  9. 非技术性的面试中的技巧性回答集锦(建议收藏)
  10. python import 找不到指定模块_Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法...