1)通过地址查询出歌词的地址。(这里楼主用URLConnection)
2)通过歌词地址缓冲歌词文件。(这里楼主用URLConnection)
3)加载缓冲好的歌词文件。
上面说的看起来还是比较容易,楼主自己写了个demo,是一个[Java](()工程,发现没啥问题,正常加载歌词文件。
等到[Android](()上,第一步就跪了。发现URLConnection的getInputStream()抛出一个io异常,简直要命,折腾了半天才发现是因为带了[http://gec 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 i.me/api/lyric/安静/周杰伦](()中文路径。由于默认是gbk,网络传输为utf-8,所以要把中文转码,URLEncoder.encode(str,“utf-8”);即可。
到了第2步,问题又出现了,歌词乱码。解决办法,用字符流操作比较合适,还要注意同一编码。
[java] [view plain](() [copy](()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPMunut2-1650775496168)(https://code.csdn.net/assets/CODE_ico.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8yBkxu7-1650775496169)(https://code.csdn.net/assets/ico_fork.svg)]
-
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©;
-
out.write©;
-
}
-
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”;
-
}
-
}
LrcProcess 类,用来保存处理下载后的文件
public class LrcProcess {
private List lrcList; //List集合存放歌词内容对象
private LrcContent mLrcContent; //声明一个歌词内容对象
/**
- 无参构造函数用来实例化对象
*/
public LrcProcess() {
mLrcContent = new LrcContent();
lrcList = new ArrayList();
}
/**
-
读取歌词
-
@param path
-
@return
*/
public String readLRC(String path) {
//定义一个StringBuilder对象,用来存放歌词内容
StringBuilder stringBuilder = new StringBuilder();
File f = new File(path.replace(“.mp3”, “.lrc”));
try {
//创建一个文件输入流对象
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis, “utf-8”);
BufferedReader br = new BufferedReader(isr);
String s = “”;
while((s = br.readLine()) != null) {
tring path) {
//定义一个StringBuilder对象,用来存放歌词内容
StringBuilder stringBuilder = new StringBuilder();
File f = new File(path.replace(“.mp3”, “.lrc”));
try {
//创建一个文件输入流对象
FileInputStream fis = new FileInputStream(f);
InputStreamReader isr = new InputStreamReader(fis, “utf-8”);
BufferedReader br = new BufferedReader(isr);
String s = “”;
while((s = br.readLine()) != null) {