Android 超简单音乐播放器(九)搜索网络歌曲,获得热门榜单(GridView)(易源api的使用)(JSON的解析)(刷新)
首先感谢易源API!
提供了QQ音乐的接口~
咳咳...
明天要写文档..看来..哎..我的歌词要等假期了?
回归正题~
首先上一下我的界面啊实现啊啥的~
点击榜单会出现对应的歌曲~
可以搜索网络歌曲~
可以刷新~
先写榜单的实现~
首先是net这个Fragment的布局代码~
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="45dp" android:background="#edebeb"> <EditText android:imeOptions="actionSearch" android:maxLines="1" android:id="@+id/et_findlocal" android:textSize="13sp" android:hint="搜索网络歌曲" android:gravity="center" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:background="@drawable/btn_white" android:layout_width="0dp" android:layout_weight="1" android:layout_height="30dp" android:layout_gravity="center"/> <ImageView android:id="@+id/iv_findNet" android:layout_marginRight="5dp" android:layout_gravity="center" android:layout_width="0dp" android:layout_weight="0.1" android:layout_height="30dp" android:background="@drawable/find"/> </LinearLayout> <RelativeLayout android:id="@+id/rl_scroll" android:layout_width="match_parent" android:layout_height="wrap_content"> <GridView android:id="@+id/main_gridview" android:layout_width="match_parent" android:layout_height="240dp" android:layout_marginTop="2dp" android:gravity="center" android:horizontalSpacing="0dp" android:numColumns="3" android:scrollbars="none" android:verticalSpacing="0dp" > </GridView> </RelativeLayout> <ImageView android:id="@+id/iv_translateAnimation" android:layout_gravity="right" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/less" /> <View android:id="@+id/vv_xian" android:layout_width="match_parent" android:layout_height="5dp" android:background="#edebeb"/> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/sr_fragment_net" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_marginTop="5dp" android:layout_width="match_parent" android:id="@+id/rv_net_song" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </com.scwang.smartrefresh.layout.SmartRefreshLayout> </LinearLayout>
然后就是写item_gridview_song.xml的代码~
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dp" android:layout_height="80dp" android:layout_margin="1dp"> <ImageView android:id="@+id/iv_item_main_gird" android:layout_width="50dp" android:layout_height="50dp" android:layout_centerInParent="true" android:src="@drawable/find" /> <TextView android:id="@+id/tv_item_main_grid" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center" android:text="民谣" /> </RelativeLayout>
好啦~界面部分就大功告成~~~然后要给gridview写一个适配器~
package com.music.adapter; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import com.music.R; /** * Created by 雅倩宝宝 on 2017/9/19. */ public class MusicGridAdapter extends BaseAdapter{private SparseArray<String> gridItems; private ViewHolder holder = null; private Context context; private int[] ids = { R.drawable.rege26,R.drawable.gaotai6,R.drawable.kge36,
}; //把图片放入一个字符组
R.drawable.liuxing4,R.drawable.neidi5,R.drawable.net28, R.drawable.oumei3,
R.drawable.xingge26,R.drawable.yinyueren32
@Override
public int getCount() {
return gridItems.size() > 0 ? gridItems.size() : 0; }
public MusicGridAdapter (SparseArray<String> gridItems, Context context) {
this.gridItems = gridItems;
this.context = context;
}
@Override
public Object getItem(int i) {
return gridItems.get(i); }
@Override
public long getItemId(int i) {
return 0; }
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view == null){
view = LayoutInflater.from(context).inflate(
R.layout.item_gridview_song,viewGroup,false);
holder = new ViewHolder(view); }
holder.tvItemMainGrid.setText(gridItems.get(i)+"");
holder.ivItemMainGird.setImageResource(ids[i]);
return view; }
private class ViewHolder {
public ImageView ivItemMainGird;
public TextView tvItemMainGrid;
public ViewHolder(View convertView) {
ivItemMainGird = convertView.findViewById(R.id.iv_item_main_gird);
tvItemMainGrid = convertView.findViewById(R.id.tv_item_main_grid);
} }}
忘记说了..
根据API给到的数据我们要创建一个musicmodle类~(补一个api地址https://www.showapi.com/api/lookPoint/213)
(哎呀 史上最乱写博主...)
public class MusicModle implements Serializable {/** * "albumid": 1181789, * "downUrl": "http://tsmusic24.tc.qq.com/104778928.mp3", * "seconds": 265, * "singerid": 12744, * "singername": "小沈阳", * "songid": 104778928, * "songname": "八戒八戒 (《西游记之孙悟空三打白骨精》电影推广曲)", * "url": "http://ws.stream.qqmusic.qq.com/104778928.m4a?fromtag=46" */ private int albumid; private String downUrl; private int seconds; private int singerid; private String singername; private int songid; private String songname; private String url; public int getAlbumid() {return albumid; }public void setAlbumid(int albumid) {this.albumid = albumid; }public String getDownUrl() {return downUrl; }public void setDownUrl(String downUrl) {this.downUrl = downUrl; }public int getSeconds() {return seconds; }public void setSeconds(int seconds) {this.seconds = seconds; }public int getSingerid() {return singerid; }public void setSingerid(int singerid) {this.singerid = singerid; }public String getSingername() {return singername; }public void setSingername(String singername) {this.singername = singername; }public int getSongid() {return songid; }public void setSongid(int songid) {this.songid = songid; }public String getSongname() {return songname; }public void setSongname(String songname) {this.songname = songname; }public String getUrl() {return url; }public void setUrl(String url) {this.url = url; }}
接下来我们需要添加两个依赖0 0.
都是第一行代码中提到过的~
阿里嘎多~
compile 'com.squareup.okhttp3:okhttp:3.9.0'//HTTP访问网络
compile 'com.google.code.gson:gson:2.7'
第一个就是连接网络!(我是这样理解的~)
第二个就是解析gson的数据~
首先0 0.创建一个HttpUtil~
由于我们用了那个啥okhttp 然后他不仅方便 还帮我们写好了回调的函数0 0.美滋滋 啊啊啊啊所以我们只需要调用callback就可以了
这应该很简单看懂了吧~
感觉自己的密匙啊啥的~填入URL的相应位置~还有榜单的序号传入 就可以获得对应的数据!~
public class HttpUtil {public static void requestStringData(final int topid ,okhttp3.Callback callback) {OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("http://route.showapi.com/213-4?showapi_appid=46426&topid="+topid+"&showapi_sign=f908983676e94a34a11a56eb71400f79").build(); client.newCall(request).enqueue(callback); }}
我的想法就是在回调中解析数据!所以在这里我又新建了一个MusicModleUtil
虽然我也不知道我为啥要这样做...可能是后面播放起来好处理吧 我是想像我之前写本地音乐那样写~喵呜~~
package com.music.util; import android.util.Log; import com.music.bean.MusicModle; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; import okhttp3.Response; /** * Created by 雅倩宝宝 on 2017/9/20. */ public class MusicModleUtil {public static List<MusicModle> list1; public static List<MusicModle> parseJOSNWithGSON (Response response){Log.i("TAG", "onCreate:5"+""); list1 = new ArrayList<>(); try{String ResponsData = response.body().string(); JSONObject jsonObject = new JSONObject(ResponsData); String error = jsonObject.getString("showapi_res_error"); if (!error.equals("")) {Log.i("TAG","error");}String body = jsonObject.getString("showapi_res_body"); JSONObject jsonObject1 = new JSONObject(body); String pagebean = jsonObject1.getString("pagebean"); JSONObject jsonObject2 = new JSONObject(pagebean); String songlist = jsonObject2.getString("songlist"); JSONArray jsonArray = new JSONArray(songlist); for (int i = 0; i < jsonArray.length() ; i++) {MusicModle musicModle = new MusicModle(); JSONObject jsonObject3 = jsonArray.getJSONObject(i); musicModle.setDownUrl(jsonObject3.getString("downUrl")); musicModle.setSingername(jsonObject3.getString("singername")); musicModle.setSongname(jsonObject3.getString("songname")); musicModle.setUrl(jsonObject3.getString("url")); list1.add(musicModle); Log.i("TAG", "onCreate:4 "+musicModle.getDownUrl()); }}catch (Exception e ){e.printStackTrace(); }return list1; } }
解析数据这里要注意了,要一步步进行解析哦~
不要越过~否则会解析不成功的~
我觉得代码都很简单了!!美滋滋~
然后我们就可以回到NetFragment中写代码了~
private Dialog progressDialog;//加载条 private boolean isHide;//判断Gridview是否隐藏
private SparseArray<String> gridItems = new SparseArray<String>(); private Map<String, Integer> maps = new HashMap<String, Integer>(); MusicGridAdapter musicGridAdapter;
第一个呢 是用来传对应的名字~
第二个是点击事件跳转的时候可以把对应的topid传过去~
第三个就是声明啦~
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_network, container, false); initData(); musicGridAdapter = new MusicGridAdapter(gridItems, getContext()); mainGridview = view.findViewById(R.id.main_gridview); mainGridview.setAdapter(musicGridAdapter); mainGridview.setOnItemClickListener(new mainGridviewListener()); ButterKnife.bind(this, view); return view; }public void showProgressDialog() {//请求网络的时候显示
if (progressDialog == null) {progressDialog = new Dialog(getContext(), R.style.Pro); progressDialog.setContentView(R.layout.dialog_loading); progressDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); TextView msg = (TextView) progressDialog.findViewById(R.id.id_tv_loadingmsg); msg.setText("(σ'・д・)σ"); progressDialog.show(); }progressDialog.show(); }public void dissmiss() { //请求网络后消失if (progressDialog != null) {progressDialog.dismiss(); }}private void initData() { //把对应的榜单名字传入gridItems.put(0, getString(R.string.msuic_fenlei_rege)); gridItems.put(1, getString(R.string.music_fenlei_gantai)); gridItems.put(2, getString(R.string.music_fenlei_Kge)); gridItems.put(3, getString(R.string.music_fenlei_liuxing)); gridItems.put(4, getString(R.string.music_fenlei_neidi)); gridItems.put(5, getString(R.string.music_fenlei_net)); gridItems.put(6, getString(R.string.music_fenlei_oumei)); gridItems.put(7, getString(R.string.music_fenlei_xingge)); gridItems.put(8, getString(R.string.music_fenlei_yinyueren)); getFenlei(); }@OnClick({R.id.iv_findNet, R.id.iv_translateAnimation})public void onViewClicked(View view) {switch (view.getId()) {case R.id.iv_findNet:
case R.id.iv_translateAnimation:if (isHide) { //对是否隐藏VIEW进行判断 如果隐藏点击则会显示 否则会隐藏 mainGridview.setVisibility(view.VISIBLE); vvXian.setVisibility(view.VISIBLE); ivTranslateAnimation.setImageResource(R.drawable.less); isHide = false; } else { // mainGridview.setVisibility(view.GONE); vvXian.setVisibility(view.GONE); ivTranslateAnimation.setImageResource(R.drawable.more_unfold); isHide = true; }break; }}/** * GirdView点击事件 */ private class mainGridviewListener implements AdapterView.OnItemClickListener {@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) {Intent intent = new Intent(getContext(), MusicListActivity.class);
//将topid传过去 intent.putExtra("musictype", maps.get(gridItems.get(position))); startActivity(intent); }}public void getFenlei() {maps.put(getString(R.string.msuic_fenlei_rege), 26); maps.put(getString(R.string.music_fenlei_gantai), 6); maps.put(getString(R.string.music_fenlei_Kge), 36); maps.put(getString(R.string.music_fenlei_liuxing), 4); maps.put(getString(R.string.music_fenlei_neidi), 5); maps.put(getString(R.string.music_fenlei_net), 28); maps.put(getString(R.string.music_fenlei_oumei), 3); maps.put(getString(R.string.music_fenlei_xingge), 27); maps.put(getString(R.string.music_fenlei_yinyueren), 32); // 热歌 26 }@Override public void onDestroyView() {super.onDestroyView(); ButterKnife.unbind(this); } }
差不多就是酱紫了
0 0.。。额 剩下的我就帖MusicListActivity 的代码吧0 0适配器啊其他什么的都是和之前的一样的~
public class MusicListActivity extends BaseActivity {@Bind(R.id.tv_toolbar)TextView tvToolbar; @Bind(R.id.tb_main)Toolbar tbMain; private int typeid = 5; List<MusicModle> list; @Bind(R.id.rv_fenlei_list)RecyclerView rvFenleiList; MusicFenAdapter musicFenAdapter; private SparseArray<String> maps = new SparseArray<String>(); @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_music_list); ButterKnife.bind(this); initTypes(); typeid = getIntent().getIntExtra("musictype", 5); setToolBar(R.id.tb_main);
//设置榜单名为标题名字
tvToolbar.setText(maps.get(typeid));
initWhiteHome();
Log.i("TAG", "onCreate: " + typeid);
showProgressDialog();
HttpUtil.requestStringData(typeid, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("TAG", "onCreate:2 " + e);
dissmiss(); }
@Override
public void onResponse(Call call, Response response) throws IOException {
musicFenAdapter = new MusicFenAdapter(MusicModleUtil.parseJOSNWithGSON(response));
//更新界面要回到主线程进行更新~ runOnUiThread(new Runnable() {@Overridepublic void run() {rvFenleiList.setLayoutManager(new LinearLayoutManager(getBaseContext())); rvFenleiList.setItemAnimator(new DefaultItemAnimator()); rvFenleiList.setAdapter(musicFenAdapter); dissmiss(); }}); }}); }
//设置标题栏的名字为榜单private void initTypes() {maps.put(26,getString(R.string.msuic_fenlei_rege)); maps.put(6,getString(R.string.music_fenlei_gantai)); maps.put(36,getString(R.string.music_fenlei_Kge)); maps.put(4,getString(R.string.music_fenlei_liuxing) ); maps.put(5,getString(R.string.music_fenlei_neidi)); maps.put(28,getString(R.string.music_fenlei_net)); maps.put(3,getString(R.string.music_fenlei_oumei)); maps.put(27,getString(R.string.music_fenlei_xingge)); maps.put(32,getString(R.string.music_fenlei_yinyueren)); } }
觉得自己真的写得好没实用...有点难过了..
那个歌曲搜索其实和榜单实现差不多..
我就不写了..
只是在解析的时候记得要把页数提取出来..
直接上一下我的完整的NetFragment吧
里面的刷新用了开源库..
compile 'com.android.support:appcompat-v7:25.3.1'//版本随意 compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3' compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.3'//没有使用特殊Header,可以不加这行
public class NetFragment extends Fragment {@Bind(R.id.et_findlocal)EditText etFindlocal; @Bind(R.id.main_gridview)GridView mainGridview; @Bind(R.id.rv_net_song)RecyclerView rvNetSong; @Bind(R.id.iv_findNet)ImageView ivFindNet; @Bind(R.id.iv_translateAnimation)ImageView ivTranslateAnimation; @Bind(R.id.vv_xian)View vvXian; @Bind(R.id.rl_scroll)RelativeLayout rlScroll; @Bind(R.id.sr_fragment_net)SmartRefreshLayout srFragmentNet; private SparseArray<String> gridItems = new SparseArray<String>(); private Map<String, Integer> maps = new HashMap<String, Integer>(); MusicGridAdapter musicGridAdapter; FindMusicAdapter findMusicAdapter; private Dialog progressDialog; private boolean isHide; private int page = 1; private int totalPage; private String name; // Animation showAction, hideAction; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_network, container, false); initData(); musicGridAdapter = new MusicGridAdapter(gridItems, getContext()); mainGridview = view.findViewById(R.id.main_gridview); mainGridview.setAdapter(musicGridAdapter); mainGridview.setOnItemClickListener(new mainGridviewListener()); ButterKnife.bind(this, view); return view; }public void showProgressDialog() {if (progressDialog == null) {progressDialog = new Dialog(getContext(), R.style.Pro); progressDialog.setContentView(R.layout.dialog_loading); progressDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); TextView msg = (TextView) progressDialog.findViewById(R.id.id_tv_loadingmsg); msg.setText("(σ'・д・)σ"); progressDialog.show(); }progressDialog.show(); }public void initView() {srFragmentNet.setOnRefreshLoadmoreListener(new OnRefreshLoadmoreListener() {@Override public void onLoadmore(final RefreshLayout refreshlayout) {MusicFindUtil.getInstance().getPage(); Log.i("totalPage2", "totalPage " + totalPage); page++; if (page<=totalPage){HttpUtil.requestSongData(name, page, new Callback() {@Override public void onFailure(Call call, IOException e) {refreshlayout.finishLoadmore(); }@Override public void onResponse(Call call, Response response) throws IOException {refreshlayout.finishLoadmore(); findMusicAdapter.addData(MusicFindUtil.parseJOSNWithGSON(response)); getActivity().runOnUiThread(new Runnable() {@Override public void run() {findMusicAdapter.addDataChange(); }}); }}); }else {Toast.makeText(getContext(), "没有更多了~~", Toast.LENGTH_SHORT).show(); refreshlayout.finishLoadmore();//记得要加这个!!!结束 }}@Override public void onRefresh(final RefreshLayout refreshlayout) {HttpUtil.requestSongData(name, 1, new Callback() {@Override public void onFailure(Call call, IOException e) {refreshlayout.finishRefresh(); Log.i("TAG", "onCreate:2 " + e); dissmiss(); }@Override public void onResponse(Call call, Response response) throws IOException {refreshlayout.finishRefresh();
//记得要加这个!!!结束
findMusicAdapter = new FindMusicAdapter(MusicFindUtil.parseJOSNWithGSON(response), getContext()); Log.i("TAG2", "onCreate:2 "); getActivity().runOnUiThread(new Runnable() { @Override public void run() { Log.i("TAG2", "onCreate:3 "); rvNetSong.setLayoutManager(new LinearLayoutManager(getContext())); rvNetSong.setItemAnimator(new DefaultItemAnimator()); rvNetSong.setAdapter(findMusicAdapter); } }); } }); } }); } public void dissmiss() { if (progressDialog != null) { progressDialog.dismiss(); } } private void initData() { gridItems.put(0, getString(R.string.msuic_fenlei_rege)); gridItems.put(1, getString(R.string.music_fenlei_gantai)); gridItems.put(2, getString(R.string.music_fenlei_Kge)); gridItems.put(3, getString(R.string.music_fenlei_liuxing)); gridItems.put(4, getString(R.string.music_fenlei_neidi)); gridItems.put(5, getString(R.string.music_fenlei_net)); gridItems.put(6, getString(R.string.music_fenlei_oumei)); gridItems.put(7, getString(R.string.music_fenlei_xingge)); gridItems.put(8, getString(R.string.music_fenlei_yinyueren)); getFenlei(); } @OnClick({R.id.iv_findNet, R.id.iv_translateAnimation}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.iv_findNet: page = 1; name = etFindlocal.getText().toString(); etFindlocal.setText(""); MusicFindUtil.getInstance().deleteDate(); showProgressDialog(); HttpUtil.requestSongData(name, 1, new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i("TAG", "onCreate:2 " + e); dissmiss(); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("TAG2", "onCreate:1 "); totalPage = MusicFindUtil.getInstance().getPage(); Log.i("totalPage", "totalPage1 " + totalPage); findMusicAdapter = new FindMusicAdapter(MusicFindUtil.parseJOSNWithGSON(response), getContext()); Log.i("TAG2", "onCreate:2 "); getActivity().runOnUiThread(new Runnable() { @Override public void run() { Log.i("TAG2", "onCreate:3 "); rvNetSong.setLayoutManager(new LinearLayoutManager(getContext())); rvNetSong.setItemAnimator(new DefaultItemAnimator()); rvNetSong.setAdapter(findMusicAdapter); initView(); srFragmentNet.setRefreshHeader(new ClassicsHeader(getContext())); } }); dissmiss(); Log.i("totalPage", "totalPage3 " + totalPage); } }); break; case R.id.iv_translateAnimation: if (isHide) {// mainGridview.startAnimation(showAction); mainGridview.setVisibility(view.VISIBLE); vvXian.setVisibility(view.VISIBLE); ivTranslateAnimation.setImageResource(R.drawable.less); isHide = false; } else {// mainGridview.startAnimation(hideAction); mainGridview.setVisibility(view.GONE); vvXian.setVisibility(view.GONE); ivTranslateAnimation.setImageResource(R.drawable.more_unfold); isHide = true; } break; } } /** * GirdView点击事件 */ private class mainGridviewListener implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(getContext(), MusicListActivity.class); intent.putExtra("musictype", maps.get(gridItems.get(position))); startActivity(intent); } } public void getFenlei() { maps.put(getString(R.string.msuic_fenlei_rege), 26); maps.put(getString(R.string.music_fenlei_gantai), 6); maps.put(getString(R.string.music_fenlei_Kge), 36); maps.put(getString(R.string.music_fenlei_liuxing), 4); maps.put(getString(R.string.music_fenlei_neidi), 5); maps.put(getString(R.string.music_fenlei_net), 28); maps.put(getString(R.string.music_fenlei_oumei), 3); maps.put(getString(R.string.music_fenlei_xingge), 27); maps.put(getString(R.string.music_fenlei_yinyueren), 32); // 热歌 26 } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.unbind(this); }}
好吧。。。我真是一个不走心的人。。。。
好好加油。。。
慢慢写出好的文。。。
加油学习。。。
静心。。。
冷静。。
~o( =∩ω∩= )m
Android 超简单音乐播放器(九)搜索网络歌曲,获得热门榜单(GridView)(易源api的使用)(JSON的解析)(刷新)相关推荐
- Android 超简单音乐播放器(十)歌词的实现
关于歌词 有下面这些: 歌词的获取 歌词的解析 自定义View 歌词的获取 歌词的获取分为两种,一种是从本地一种是通过网络上提供的API获取.我选择的是歌词迷的API http://api.geci. ...
- Android 超简单音乐播放器(三)根据歌曲名或者歌手搜索本地音乐(EditText监听)
在MusicUtil中添加一个SearchSong的方法 public List<Song> SearchSong(String name) {List<Song> list2 ...
- Android 超简单音乐播放器(六)播放暂停音乐,更换播放模式,上下歌曲切换(service)
创建service 当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法. 当再次start Service,这次只有onStartCo ...
- android音乐播放器实现,Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...
- Android:简单音乐播放器,实现歌曲列表显示,播放暂停,切歌等功能
效果截图(大作业不建议用,太简单了) 源码下载 简单音乐播放器
- android音乐播放器完整教程,android实现简单音乐播放器
本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...
- android在线音乐播放器教程,android实现简单音乐播放器
本文实例为大家分享了android音乐播放器的具体代码,供大家参考,具体内容如下 话不多说先上效果 前言 写这个音乐播放器实在是迫不得已.因为我们Andoird课程要求写一个音乐播放器.所以就有了此项 ...
- 安卓java音乐播放器下一曲_Android实现简单音乐播放器(MediaPlayer)
Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...
- 安卓简单音乐播放器——上一首、下一首、暂停和停止
安卓超简单音乐播放器 功能上一首.下一首.暂停和停止 歌曲状态控制语句: switch (control){// 播放或暂停case 1:// 原来处于没有播放状态if (status == 0x11 ...
最新文章
- python读写excel数据--pandas
- Access denied for user ‘root‘@‘localhost‘ (using password:YES) 解决方案
- 配置SQL Server 2005 远程连接(转)
- java中的model_Java程序员必看之springmvc中的Model对象在重定向中的数据
- 海康威视Web端视频开发
- Java集合总结大全--史上最强
- 使用mcisendstring重复播放音乐文件
- java下载execl优化_Java内存优化之POI Excel(二)
- 我的家乡html网页设计,创作一个以“我的家乡”为主题的网站
- 购买域名和个人网站备案流程
- 基于PHP+Zend Studio 13 + MYSQL+饭店预订管理系统
- 专注于win7官网,专注win7系统安装
- MySQL从删库到跑路(3):神奇的select
- day96 scrapy
- iOS小技能:iOS15适配导航条主题: 背景颜色、标题颜色
- windows 10环境下docker 部署RocketMq和RocketMq-Consol 控制台
- SIGGRAPH 2022 | 基于GAN的新动作合成
- re python 引擎_python 详解re模块
- 提升新网站优化排名,学会这三个方法就够了
- vue中warning_使用vue的i18n 出现很多warning提示
热门文章
- 什么是生命周期?Activity生命周期的三种状态
- SQL Server—T-SQL编程
- save-ps-to-svg1.0百度网盘资源
- Java学习路线图,内附完整Java自学视频教程+工具经验
- 饿了么虚拟号码可以发短信吗_饿了么隐私
- 国产银河麒麟系统源码安装Openvas
- android高德地图线路,独立路径规划-路线规划-开发指南-Android 导航SDK | 高德地图API...
- 翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序
- cv2,PIL,plt,tensorflow方法图片显示及plt的的plt.colorbar()的使用需要注意
- stata命令汇总_Stata常用命令应知应会(500条)