我正在开发一个应用程序,需要通过流媒体播放现场音乐文件。
在请求歌曲api中,我可以指定带宽(例如:50kbps, 100kbps, 300,600或1mbps)。
带宽越大,获取文件的时间就越长。因为我不希望用户受到限制,所以我有多种选择来处理它:
-
检测手机是使用3g, wifi还是Edge,并为每种连接速度指定带宽
-
让用户决定他将得到的歌曲的质量:像youtube(但用户不会是了解计算机的人:软件越容易,它就越适合)
-
有一种正确评估连接速度的方法:像获取文件一样,测量它所花费的时间并设置带宽。
我知道如果用户失去wifi,或者在街上使用3g,连接速度可能会有很大变化。问题是,当歌曲播放时,我无法改变带宽。
也许你有你想分享的经验?
谢谢!
Facebook发布了一个库:
https://github.com/facebook/network-connection-class为什么不试着改变一下你对事物的看法呢?试着与你的用户交流。假设您的用户希望下载128kbit质量的歌曲。你开始下载,在下载的同时,你设定一个平均下载时间,花几秒钟让这个平均时间稳定下来,如果低于某个值,就弹出一个窗口,告诉用户他的连接速度太慢,不适合当前的带宽,并询问他是降低质量还是继续慢速下载。
这将:
- 允许用户选择始终假设他们可以获得最佳质量的媒体。
- 允许你在运行时检查,并在下载时相应地更改质量,而无需预先检查。
- 让你的应用对用户来说更简单。
我知道我没有回答你的具体要求,我只是提供了一个不同的观点。
protected String doInBackground(String... urls) {
String response = "";
startTime = System.currentTimeMillis();
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
endTime = System.currentTimeMillis();
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
long dataSize = result.length() / 1024;
takenTime = endTime - startTime;
long s = takenTime / 1000;
double speed = dataSize / s;
Toast.makeText(context, "" + s + "kbps", Toast.LENGTH_SHORT).show();
}
检测Android的网络连接类型
您可以在这里查看所有可用选项:http://developer.android.com/reference/android/telephony/TelephonyManager.html
这可以修复移动网络类型,但不能帮助你提高Wifi速度,你应该从你知道的服务器上下载一些代码并计算时间。