评估连接速度的最佳方法

35

我正在开发一个应用程序,需要通过流式传输获取音乐文件,以进行实时播放。

在请求歌曲API中,我可以指定带宽(例如:50kbps、100kbps、300、600或1 Mbps)。

带宽越大,获取文件的时间就越长。由于我不希望用户受到限制,因此我有多种选择来处理这个问题:

  • 检测手机是否使用3G、wifi或Edge,并为每种连接速度指定一个带宽。

  • 让用户决定他将获得的歌曲质量:像YouTube一样(但用户不会是了解计算机知识的人:软件越简单,适合的用户就越多)

  • 有一种方法能够正确评估连接速度:像获取文件一样,测量所花费的时间并设置带宽。

我知道,如果用户失去wifi,或者在街上使用3G移动,连接速度可能会变化很大。而且,当歌曲正在播放时,我无法更改带宽。

也许你有经验想要分享吗?

谢谢!


请查看android.net.ConnectionManager以了解设备的连接状态(无连接、移动网络、WiFi等)。 - Philipp Reichart
当然,这是我提出的第一个解决方案。但是有些WiFi连接可能比3慢。 - GrandMarquis
用于歌曲的 API 是哪些? - mr.hir
4个回答

43

1
非常感谢,这对我帮助很大! - konata

5
为什么不尝试改变你对事物的看法呢?试着与用户一起流动。比如,当用户想要下载128 kbit高质量的歌曲时,你可以开始下载并计算平均下载时间,在几秒钟内稳定平均值,如果低于某个值就弹出一个提示框告诉用户他的连接速度太慢无法支持当前带宽,询问他是否降低音质或继续慢速下载。
这样做会有以下好处:
1.让用户始终有选择得到最佳质量的媒体文件的选项。
2.在运行时对下载进行检查并根据需要更改音频质量,无需预先检查。
3.使你的应用程序对用户来说更加简单易用。
我知道我没有回答你的具体要求,只是提供了另一种观点。

很好的观点,这正是我期待的答案类型。唯一不好的是我必须从头开始重新下载。我会和我的团队成员商量一下,看看该怎么办。 - GrandMarquis

4
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();
}

你能为startTime和endTime变量添加初始化器吗?我们不确定它是long类型还是什么类型。 - Pier Betos

2

3
谢谢,我了解搜索引擎。这是一个真正的问题,而不是我太懒不想在谷歌上搜索的问题。下次请提供来源:https://dev59.com/r3E85IYBdhLWcg3wYicB - GrandMarquis
不客气,只是试图帮助而已,总之,你在TelephonyManager中有所有的选项来解决连接类型问题。至于其他方面,我认为你应该在现场测试一下带宽。关于来源,你是对的,我已经进行了编辑,并为此向你道歉。 - atzu
好的,那我会尝试第三个选项:获取一个文件并计算所需时间以计算带宽 ;) - GrandMarquis
只要你不像你所说的那样频繁切换网络,你就可以相当准确地了解移动网络的带宽。 - atzu
更改了它,因为正如你所说,只是复制并粘贴,我认为最好不要重复内容。 - atzu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接