300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android本地及网络音乐播放器-网络音乐的搜索(三)

Android本地及网络音乐播放器-网络音乐的搜索(三)

时间:2021-12-20 21:44:30

相关推荐

Android本地及网络音乐播放器-网络音乐的搜索(三)

当音乐播放器的本地音乐播放和音乐播放界面实现后,我们将逐渐开始网络音乐功能的拓展,本文主要将的是如何实现网络音乐的搜索以及将搜索到的结果以列表的形式展示出来,主要设计的内容包括:音乐接口的使用,添加网络请求(这里使用的是volley-下载地址,下载完将volley.jar拷到项目/libs下),处理响应返回的数据-json(相应的类在org.json包下)

NetFragment.java的主要代码如下:

package fortmusic_1.fragment;import java.io.UnsupportedEncodingException;import .URLEncoder;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import com.android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.Request.Method;import com.android.volley.toolbox.StringRequest;import com.android.volley.toolbox.Volley;import fortmusic_1.MainActivity;import fortmusic_1.R;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.support.v4.app.Fragment;import android.util.Log;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.SearchView;import android.widget.TextView;import android.widget.Toast;import android.widget.AbsListView.LayoutParams;import android.widget.SearchView.OnQueryTextListener;public class NetFragment extends Fragment {//搜索音乐接口public static final String CLOUD_MUSIC_API_PREFIX = "http://s./search/get/?";//搜索响应时返回的数据public static String getResponse;//将响应getResponse包装成JSONObject进行解析public static JSONObject jo;//解析出来的结果存在searchResults里并在musicList里以列表的形式展示public static List<Map<String, String>> searchResults = new ArrayList<Map<String, String>>(); private SearchView searchView;//搜索框ListView musicList;//展示搜索的音乐结果String TAG = "NetFragment";Handler handler; RequestQueue mQueue = null; //网络请求队列@Overridepublic void onAttach(Activity activity) {// TODO Auto-generated method stubsuper.onAttach(activity);}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View rootView = inflater.inflate(music, container, false);searchView = (SearchView)rootView.findViewById(R.id.searchView1);musicList = (ListView) rootView.findViewById(musiclist);mQueue = Volley.newRequestQueue(NetFragment.this.getActivity()); Log.d(TAG, Environment.getExternalStorageDirectory().getAbsolutePath());handler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0) {musicList.setAdapter(getAdapter());Log.d(TAG,"getMusic!");} else if (msg.what == 1) {Toast.makeText(NetFragment.this.getActivity(), "下载完成!", 300).show();Log.d(TAG,"下载完成!");}}};searchView.setOnQueryTextListener(new OnQueryTextListener() {@Overridepublic boolean onQueryTextChange(String arg0) {return false;}@Overridepublic boolean onQueryTextSubmit(String query) {//搜索框输入内容点击搜索调用getSong(query)方法Toast.makeText(NetFragment.this.getActivity(), "搜索内容为:" + query, 300).show();musicList.setAdapter(null);searchResults.clear();getSong(query); return false;}});return rootView;}/*** 这里先将搜索内容进行UTF-8编码,再与音乐搜索接口进行拼接组成网络请求url* @param search*/public void getSong(String search) {if (search.equals("")) return;Log.d(TAG,"connecting...");Toast.makeText(NetFragment.this.getActivity(), "connectURL...", 300).show(); String s = null;if (search != null) { try {s= URLEncoder.encode(search, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();} }final String url = CLOUD_MUSIC_API_PREFIX + "type=1&s='" + s + "'&limit=20&offset=0"; Log.d(TAG, "url = " + url);//请求类,请求返回数据response类型为StringStringRequest stringRequest = new StringRequest(Method.GET,url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d(TAG, response); getResponse = response;showList();} }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, error.getMessage(), error); Toast.makeText(NetFragment.this.getActivity(), "请检查网络连接!", 300).show();} }); mQueue.add(stringRequest); //请求添加到队列里}/*** 将String类型的响应包装成JSONObject类型进行解析* 其中JSONObject是{key1:value1, key2:value2, ...}形式的类似map的键值对,其中value也可以是JSONObject,即嵌套* JSONArray是[JSONObject,JSONObject,...]形式的数据结构*/protected void showList() {Log.d(TAG, "showList");try {jo = new JSONObject(getResponse);String result = jo.getString("result");String songs = new JSONObject(result).getString("songs");JSONArray js = new JSONObject(result).getJSONArray("songs");for (int i=0; i<js.length(); i++) {JSONObject child = js.getJSONObject(i);JSONArray artists = child.getJSONArray("artists");String artist = artists.getJSONObject(0).getString("name");String name = child.getString("name");String audioUrl = child.getString("audio");JSONObject album = child.getJSONObject("album");String picUrl = album.getString("picUrl");Map<String, String> item = new HashMap<String, String>();item.put("name", name);item.put("artist", artist);item.put("audioUrl", audioUrl);item.put("picUrl", picUrl);searchResults.add(item);Log.d(TAG, "name = " + name + "---artists:" + artist);Log.d(TAG, "audioUrl = " + audioUrl);Log.d(TAG, "picUrl = " + picUrl);}handler.sendEmptyMessage(0);Toast.makeText(NetFragment.this.getActivity(), "下载完成!", 300).show();} catch (JSONException e) {e.printStackTrace();} }//构建搜索结果列表的适配器private BaseAdapter getAdapter() {BaseAdapter adapter = new BaseAdapter() {@Overridepublic int getCount() {return searchResults.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View view, ViewGroup parent) {Map<String, String> map = searchResults.get(position);LinearLayout line = new LinearLayout(NetFragment.this.getActivity());line.setOrientation(LinearLayout.HORIZONTAL);line.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,100));ImageView musicTag = new ImageView(NetFragment.this.getActivity());musicTag.setImageResource(R.drawable.music);musicTag.setLayoutParams(new LayoutParams(80,80));//标题格式设置TextView songTitle = new TextView(NetFragment.this.getActivity());String musicName = map.get("name");songTitle.setWidth(MainActivity.screenWidth/2);songTitle.setHeight(100);songTitle.setMaxLines(1);songTitle.setTextColor(Color.MAGENTA);songTitle.setTextSize(18);songTitle.setText(musicName);songTitle.setGravity(TextView.TEXT_ALIGNMENT_CENTER);songTitle.setGravity(Gravity.CENTER_VERTICAL);//艺术家格式设置TextView artist = new TextView(NetFragment.this.getActivity());artist.setGravity(TextView.TEXT_ALIGNMENT_CENTER);artist.setWidth(MainActivity.screenWidth/3);artist.setHeight(100);artist.setTextColor(Color.MAGENTA);artist.setText(map.get("artist"));artist.setTextSize(15);artist.setMaxLines(1);artist.setPadding(50, 0, 0, 10);artist.setGravity(Gravity.RIGHT);//下载图标ImageView download = new ImageView(NetFragment.this.getActivity());download.setImageResource(R.drawable.downloaded_music);download.setLayoutParams(new LayoutParams(70,80));download.setPaddingRelative(10, 0, 0, 0);line.addView(musicTag);line.addView(songTitle);line.addView(artist);line.addView(download);return line;}};return adapter;}@Overridepublic void onDestroy() {super.onDestroy();}}

该功能实现的核心在于对网络响应返回的json数据的解析-(另为了便于理解解析json数据过程,附上一段json数据格式的response,结合showList()看更容易理解)

{"result":{"songCount":463,"songs":[{"id":65126,"name":"红玫瑰","artists":[{"id":2116,"name":"陈奕迅","picUrl":null}],"album":{"id":6404,"name":"1997- 跨世纪国语精选","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1./WJgLE2ImnLgqPPLQSlF7iQ==/114349209289440.jpg"},"audio":"http://m2./J_dEE5O0YuytnLWoFHsYCw==/8002245628486539.mp3","djProgramId":0,"page":"/m/song/65126"},{"id":420513158,"name":"红蔷薇白玫瑰","artists":[{"id":7763,"name":"G.E.M.邓紫棋","picUrl":null}],"album":{"id":34767677,"name":"红蔷薇白玫瑰","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1./ExDuzcVK5vkMNpPpzmFX6Q==/3446968958754370.jpg"},"audio":"http://m2./HrWiNyX5yRroNh4QCcJy4A==/3413983618586421.mp3","djProgramId":0,"page":"/m/song/420513158"},{"id":65533,"name":"红玫瑰","artists":[{"id":2116,"name":"陈奕迅","picUrl":null}],"album":{"id":6434,"name":"认了吧","artist":{"id":0,"name":"","picUrl":null},"picUrl":"http://p1./obu1uFbrm9EjrVpqaaKQvw==/90159953489756.jpg"},"audio":"http://m2./eeSo9acw4OUaGtqnOpV2hA==/3273246115947004.mp3","djProgramId":0,"page":"/m/song/65533"},......] }

Android本地及网络音乐播放器源码下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。