今天主要分析音乐搜索这部分的实现机制
Jamendo代码里面实现音乐搜索主要是使用了Apache Http 4.0 和JSON,Jamendo官网提供API供应用程序查询数据,且提供了四种方式查询,依次是:Artist,Tag,UserPlaylist和UserStarredAlbums
具体分析如下:
private void albumSearch(int id){
JamendoGet2Api service = new JamendoGet2ApiImpl();
String query = mSearchEditText.getText().toString();
Album[] albums = null;
try {
switch (id) {
case 0:
albums = service.searchForAlbumsByArtist(query);
SearchActivity.this.mSearchMode = SearchMode.Artist;
break;
case 1:
albums = service.searchForAlbumsByTag(query);
SearchActivity.this.mSearchMode = SearchMode.Tag;
break;
case 3:
albums = service.getUserStarredAlbums(query);
SearchActivity.this.mSearchMode = SearchMode.UserStarredAlbums;
break;
default:
return;
}
AlbumAdapter albumAdapter = new AlbumAdapter(SearchActivity.this);
albumAdapter.setList(albums);
albumAdapter.setListView(mSearchListView);
mAdapter = albumAdapter;
} catch (JSONException e) {
e.printStackTrace();
} catch (WSError e) {
publishProgress(e);
this.cancel(true);
}
}
在代码中提供了JamendoGet2Api接口及其接口实现JamendoGet2ApiImpl,那我们看看JamendoGet2Api提供了什么
/**
* Retrieve "this week's most popular albums"
* <br><br>
* http://api.jamendo.com/get2/id+name+url+image+artist_name/album/jsonpretty/?n=5&order=ratingweek_desc
* @return an array of albums
* @throws JSONException
* @throws WSError
*/
Album[] getPopularAlbumsWeek() throws JSONException, WSError;
随便拿一个查询PopularAlbumsWeek()函数来分析,通过看其注释,可以看出,Jamendo提供了http://api.jamendo.com/get2/id+name+url+image+artist_name/album/jsonpretty/?n=5&order=ratingweek_desc供应用程序查询和调用
很明显是采用JSON的方式与服务器进行数据交互。接下来我们看看getPopularAlbumsWeeK()的实现:
private String doGet(String query) throws WSError{
return Caller.doGet(GET_API + query);
}
@Override
public Album[] getPopularAlbumsWeek() throws JSONException, WSError {
String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?n=20&order=ratingweek_desc");
if(jsonString == null)
return null;
JSONArray jsonArrayAlbums = new JSONArray(jsonString);
return AlbumFunctions.getAlbums(jsonArrayAlbums);
}
调用Caller.doGet(GET_API+query):
/**
* Performs HTTP GET using Apache HTTP Client v 4
*
* @param url
* @return
* @throws WSError
*/
public static String doGet(String url) throws WSError{
String data = null;
if(requestCache != null){
data = requestCache.get(url);
if(data != null){
Log.d(JamendoApplication.TAG, "Caller.doGet [cached] "+url);
return data;
}
}
// initialize HTTP GET request objects
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse;
try {
// execute request
try {
httpResponse = httpClient.execute(httpGet);
} catch (UnknownHostException e) {
WSError wsError = new WSError();
wsError.setMessage(e.getLocalizedMessage());
throw wsError;
} catch (SocketException e){
WSError wsError = new WSError();
wsError.setMessage(e.getLocalizedMessage());
throw wsError;
}
// request data
HttpEntity httpEntity = httpResponse.getEntity();
if(httpEntity != null){
InputStream inputStream = httpEntity.getContent();
data = convertStreamToString(inputStream);
// cache the result
if(requestCache != null){
requestCache.put(url, data);
}
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.d(JamendoApplication.TAG, "Caller.doGet "+url);
return data;
}
在程序中调用convertStreamToString()讲Stream流转换成String
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
然后在通过调用JSON提供的API方法,JSONArray jsonArrayAlbums = new JSONArray(jsonString);
public static Album[] getAlbums(JSONArray jsonArrayAlbums) throws JSONException {
int n = jsonArrayAlbums.length();
Album[] albums = new Album[n];
AlbumBuilder albumBuilder = new AlbumBuilder();
for(int i=0; i < n; i++){
albums[i] = albumBuilder.build(jsonArrayAlbums.getJSONObject(i));
}
return albums;
}
至此整个搜索完成
最后总结下整个过程:
1.获得调用的API URL链接,调用Caller.doGet() 实现方式是通过HttpClient,然后就是将获得的Stream转换成JSONArray构造所需要的String,最后就是调用 getAlbums(JSONArray jsonArrayAlbums) 。
- 大小: 41.3 KB
- 大小: 36.9 KB
分享到:
相关推荐
Jamendo在线音乐播放器是一款android平台在开源的在线音乐播放,该播放器的主要特色如下: 1. 界面美观,在jamendo播放器中精美的布局的随处可见,大量使用自定义控件和Adapter进行布局,这点可供初学者好好探讨...
Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载Android应用源码之jamendo-开源在线音乐.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考
jamendo-开源在线音乐
jamendo_一款android开源的在线音乐播放器源代码
Android应用源码之jamendo-开源在线音乐_jamendo
著名的开源音乐播放器jamendo。 写的比较好,有兴趣的同学可以参考一下。
telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器)安卓源码.7z
安卓Android源码——jamendo-开源在线音乐.zip
jamendo-开源在线音乐,这是一款来自国外的Android 原生音乐播放APP软件,支持专辑加载,支持各种音乐的播放控制,界面简洁实用,它的价值的是代码的参考性比较大,这个播放软件还可下载音乐,运行视图如截图所示,...
jamendo-开源在线音乐
jamendo-开源在线音乐.zip
jamendo 是全国最大的开源音乐播放器 是android 初学者的好实例 初学者可以通过对jamendo 源码的研究 可以对android'有基础性的认识 jamendo源码可以对四大组件都有 质的的认识和理解
源码参考,欢迎下载
源码参考,欢迎下载
小程序源码 telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip
安卓开发-jamendo-开源在线音乐.zip
Android源码——telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip
安卓Android源码——telecapoland-jamendo-android-6cd07fb(国外开源音乐播放器).zip