android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词

在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773。假设没有本地歌词怎么办?如今来将一下载入在线歌词。好了,还是用那张图。

在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api。尽管还是资源不全。并且还有非常多错误。

特别头疼的是有时候歌词竟然不分行。解析起来简直难受。

歌词迷api歌词查询地址:http://geci.me/api/lyric/

比方我要查询:   http://geci.me/api/lyric/安静/周杰伦

会得到一下json串:

{"count": 2, "code": 0, "result": [{"aid": 2223011, "artist_id": 30796, "song": "\u5b89\u9759", "lrc": "http://s.geci.me/lrc/257/25700/2570058.lrc", "sid": 2570058}, {"aid": 2336033, "artist_id": 30796, "song": "\u5b89\u9759", "lrc": "http://s.geci.me/lrc/272/27282/2728244.lrc", "sid": 2728244}]}

非常easy发现里面的歌词文件。然后缓冲到本地(SweetMusicPlayer/Lryics)下,再按本地载入的方式即可了。

捋一捋,我们载入歌词文件要经过下面步骤。

1)通过地址查询出歌词的地址。

(这里楼主用URLConnection)

2)通过歌词地址缓冲歌词文件。

(这里楼主用URLConnection)

3)载入缓冲好的歌词文件。

上面说的看起来还是比較easy,楼主自己写了个demo,是一个javaproject,发现没啥问题。正常载入歌词文件。

等到android上,第一步就跪了。发现URLConnection的getInputStream()抛出一个io异常,简直要命。折腾了半天才发现是由于带了http://geci.me/api/lyric/安静/周杰伦中文路径。

由于默认是gbk,网络传输为utf-8,所以要把中文转码。URLEncoder.encode(str,"utf-8");就可以。

到了第2步,问题又出现了,歌词乱码。

解决的方法,用字符流操作比較合适,还要注意同一编码。

package com.huwei.sweetmusicplayer.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Random;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.os.Environment;
import android.util.Log;

public class OnlineLrcUtil {
	private static String TAG = "OnlineLrcUtil";
	private static OnlineLrcUtil instance;
	public static final String lrcRootPath = Environment
			.getExternalStorageDirectory().toString()
			+ "/SweetMusicPlayer/Lyrics/";

	public static final String queryLrcURLRoot = "http://geci.me/api/lyric/";

	public static OnlineLrcUtil getInstance() {
		if (null == instance) {
			instance = new OnlineLrcUtil();
		}

		return instance;
	}

	public String getQueryLrcURL(String title, String artist) {
		return queryLrcURLRoot + Encode(title) + "/" + Encode(artist);
	}

	public String getLrcURL(String title, String artist) {
		String queryLrcURLStr = getQueryLrcURL(title, artist);
		try {
			URL url = new URL(queryLrcURLStr);
			URLConnection urlConnection = url.openConnection();
			urlConnection.connect();

			BufferedReader in = new BufferedReader(new InputStreamReader(
					urlConnection.getInputStream()));

			StringBuffer sb = new StringBuffer();

			String temp;
			while ((temp = in.readLine()) != null) {
				sb.append(temp);
			}

			JSONObject jObject = new JSONObject(sb.toString());
			int count = jObject.getInt("count");
			int index = count == 0 ? 0 : new Random().nextInt() % count;
			JSONArray jArray = jObject.getJSONArray("result");
			JSONObject obj = jArray.getJSONObject(index);
			return obj.getString("lrc");

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;
	}

	// 歌手,歌曲名中的空格进行转码
	public String Encode(String str) {

		try {
			return URLEncoder.encode(str.trim(), "utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return str;

	}

	// 歌词文件网络地址,歌词文件本地缓冲地址
	public boolean wrtieContentFromUrl(String urlPath, String lrcPath) {
		Log.i(TAG, "lrcURL" + urlPath);

		try {
			URL url = new URL(urlPath);

			URLConnection urlConnection = url.openConnection();
			urlConnection.connect();

			HttpURLConnection httpConn = (HttpURLConnection) urlConnection;
			if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
				File file = new File(lrcRootPath);
				if (!file.exists()) {
					file.mkdirs();
				}

				BufferedReader bf = new BufferedReader(new InputStreamReader(
						urlConnection.getInputStream(), "utf-8"));
				PrintWriter out = new PrintWriter(new BufferedWriter(
						new OutputStreamWriter(new FileOutputStream(lrcPath),
								"utf-8")));

				char c[] = new char[256];
				int temp = -1;
				while ((temp = bf.read()) != -1) {
					bf.read(c);
					out.write(c);
				}

				bf.close();
				out.close();

				return true;
			}

			// System.out.println("getFile:"+str);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return false;
	}

	public String getLrcPath(String title, String artist) {
		return lrcRootPath + title + " - " + artist + ".lrc";
	}
}

下一篇摇一摇切歌:http://blog.csdn.net/huweigoodboy/article/details/39880779

版权声明:本文博客原创文章,博客,未经同意,不得转载。

android音乐播放器开发 SweetMusicPlayer
智能负载直插式歌词

时间: 2024-10-14 01:00:10

android音乐播放器开发 SweetMusicPlayer 智能负载直插式歌词的相关文章

android音乐播放器开发 SweetMusicPlayer 智能加载在线歌词

上一篇写了使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773,如果没有本地歌词怎么办?现在来将一下加载在线歌词.好了,还是用那张图. 在实现这个功能的时候,lz尝试过baidu api,歌词迷api,后来选用了歌词迷api,虽然还是资源不全,而且还有很多错误.特别头疼的是有时候歌词居然不分行,解析起来简直难受. 歌词迷api歌词查询地址:http://geci.me/api/lyric/ 比如

android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词

上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539,现在来将一下加载本地歌词.好了,还是用那张图. 一,从内存卡上匹配歌词 将会从以下路径匹配 1)  SweetMusicPlayer/Lyrics/ 2)  歌曲同级目录下 3)  歌曲父级目录/lryics(Lryic加不加s,首字母大小与否又分情况) LrcContent package com.huwei.sweetmusicp

android音乐播放器开发 SweetMusicPlayer 加载歌曲列表

上一篇写了播放器的整体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,现在来总结下加载歌曲列表. 比较好的实现思路就是,自己维护一个SQLite数据库,然后音乐信息都从sd卡上扫描,好处有很多,但是这样做的话代码量会比较大,写了一段扫描sd卡的代码,然后发现扫描音乐的速度简直慢的惊人,可能自己的目录太多,太深,目前还没想到一个比较好的算法去快速扫描sd卡. 楼主比较偷懒,android自己本身有一个关于媒体信息的数据

android音乐播放器开发 SweetMusicPlayer 播放本地音乐

上一篇写了加载歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,现在来总结下播放本地音乐. 一,MediaPlayer 首先来看看MediaPlayer的生命周期: Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态.这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确

android音乐播放器开发 SweetMusicPlayer 载入歌曲列表

上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https://github.com/huweigoodboy/SweetMusicPlayer 比較好的实现思路就是.自己维护一个SQLite数据库,然后音乐信息都从sd卡上扫描,优点有非常多,可是这样做的话代码量会比較大,写了一段扫描sd卡的代码.然后发现扫描音乐的速度简直慢的惊人,可能自己的文件夹太多,太

android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

上一篇写了如何在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,现在来讲讲摇一摇功能开发. 同样用了一个Service去实现摇一摇. ShakeListener继承自SensorEventListener,当加速度感应器感受到重力变化,就去通知onShakeListener调用onShake(), 在震动的同时随机一首歌. 一,加速度感应器 在这里需要设置一个速度阈值和时间间隔,控制一定的时间间隔才能触发第二次震动

android音乐播放器开发教程

android音乐播放器开发教程 android音乐播放器开发教程,布布扣,bubuko.com

Android音乐播放器开发

今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是.MP3的音乐,这个例子在main.xml设置listView的时候,注意:android:id="@+id/android:list"的设置,否则程序会报错,说找不到listview.这个效果还是不错的.可以当做是简单的音乐播放器,可以读取sdcard里面后缀是.MP3的歌曲.有问题可以留言,想要源码可以留言,这个代码比较简单.转载请标明出处: http://blog.csdn.net/wdaming1986/

Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

Android音乐播放器(歌词.均衡器.收藏.qq5.0菜单.通知) 一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 下载地址:http://www.devstore.cn/code/info/1144.html 运行截图:     热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较