【问题标题】:Best way to evaluate connection speed评估连接速度的最佳方法
【发布时间】:2024-01-17 18:30:01
【问题描述】:

我正在开发一个应用程序,它需要通过流媒体获取音乐文件以进行直播。

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

带宽越大,获取文件的时间就越多。因为我不希望用户受到限制,所以我有多种选择来处理它:

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

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

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

我知道,如果用户松开 wifi,或者在街上移动时使用 3g,连接速度可能会有很大差异。问题是当歌曲播放时我无法更改带宽。

也许你有一些你想分享的经验?

谢谢!

【问题讨论】:

  • 查看android.net.ConnectionManager 了解设备的连接方式(无、移动、wifi 等)。
  • 当然,这是我说的第一个解决方案。但有些 wifi 连接速度可能会慢于 3..
  • 歌曲使用哪个api??

标签: android networking 3g android-wifi


【解决方案1】:

Facebook 为此发布了一个库:

https://github.com/facebook/network-connection-class

这在 2011 年不存在..

【讨论】:

  • 非常感谢,这对我帮助很大!
【解决方案2】:

为什么不尝试改变你对事物的看法。 尝试与您的用户一起流动。假设您的用户希望下载 128 kbit 质量的歌曲。你开始下载,在下载时你会计算一个平均下载时间,这个平均值需要几秒钟才能稳定下来,如果它低于某个值,就会弹出一个窗口告诉用户他的连接对于当前带宽来说太慢并询问如果要降低质量或继续缓慢下载。

这将:

  1. 让用户可以选择始终假设他们可以获得最优质的媒体。
  2. 让您在运行时检查并在下载时相应地更改质量,而无需预先检查。
  3. 让您的应用对用户来说简单。

我知道我不是在回答您的具体要求,我只是提供不同的观点。

【讨论】:

  • 不错的观点,这正是我正在等待的答案类型。对我不利的一件事是我会让你从头开始重新下载。我会和我的队友谈谈,我们会看到
【解决方案3】:
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 变量添加初始化器吗?我们不确定它是长还是什么。
【解决方案4】:

Detect network connection type on Android

您可以在此处查看所有可用选项:http://developer.android.com/reference/android/telephony/TelephonyManager.html

这可以修复移动网络类型,但不能帮助您提高 Wifi 速度,您应该通过从您知道的服务器下载一些内容并计算时间来对其进行编码。

希望对你有帮助。

【讨论】:

  • 谢谢,我知道搜索引擎,这是一个真正的问题,我懒得在谷歌上搜索。下次:给源*.com/questions/2802472/…
  • 不客气,您只是想提供帮助,无论如何,您可以在 TelephonyManager 中使用所有选项来解决连接类型问题。另一方面,我认为您应该在现场测试您的带宽。您对来源是正确的,已编辑,对此我深表歉意。
  • 好的,那我试试第三个选项:获取一个文件和花费的时间:计算带宽;)
  • 嗯,您可以非常准确地了解移动网络的带宽,只要您不按照您说的从一个切换到另一个。
  • 改了,因为正如你所说,只是c&p-ed,我认为最好不要复制内容。
最近更新 更多