如何在我的Android应用程序中确定Internet速度

时间:2016-08-08 12:57:57

标签: android mobile wifi monitor wifimanager

在我的应用程序中,我希望当我点击一个按钮时,它会显示确切的互联网速度。 我已经阅读了有关此问题的所有答案,该问题已在此链接determining internet speed in androidCalculating Internet Speed in androidInternet Speed in android programming等中提出过。 但我没有完全找到答案。我用过这个:

  

WifiInfo.getLinkSpeed()

但显示最高速度。我也使用这个代码:

  

TrafficStats

但它对我不起作用。我需要显示我的网络速度(即100 kbps)。我怎样才能做到这一点? 请帮帮我。

3 个答案:

答案 0 :(得分:4)

要确定Android应用程序中的互联网速度,首先需要从onlineserver下载一些文件。 为什么我们需要下载文件?检查互联网下载速度的平均值。

为此您需要像这样编码

 private class InternetSpeedTest
        extends AsyncTask<String, Void, String> {

    long startTime;
    long endTime;
    private long takenTime;

    @Override
    protected String doInBackground(String... paramVarArgs) {

        startTime = System.currentTimeMillis();
        Log.d(TAG, "doInBackground: StartTime" + startTime);

        Bitmap bmp = null;
        try {
            URL ulrn = new URL(paramVarArgs[0]);
            HttpURLConnection con = (HttpURLConnection) ulrn.openConnection();
            InputStream is = con.getInputStream();
            bmp = BitmapFactory.decodeStream(is);

            Bitmap bitmap = bmp;
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 99, stream);
            byte[] imageInByte = stream.toByteArray();
            long lengthbmp = imageInByte.length;

            if (null != bmp) {
                endTime = System.currentTimeMillis();
                Log.d(TAG, "doInBackground: EndTIme" + endTime);
                return lengthbmp + "";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    protected void onPostExecute(String result) {

        if (result != null) {
            long dataSize = Integer.parseInt(result) / 1024;
            takenTime = endTime - startTime;
            double s = (double) takenTime / 1000;
            double speed = dataSize / s;
            Log.d(TAG, "onPostExecute: " + "" + new DecimalFormat("##.##").format(speed) + "kb/second");
        }
    }

在此代码中,将从@ykaragol's Twiddle

下载图片

在doInBackground中,您将在此处完成下载后计算图像的大小

Bitmap bitmap = bmp;
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 99, stream);
        byte[] imageInByte = stream.toByteArray();
        long lengthbmp = imageInByte.length

最后一件事是通过减去endtime表单开始时间来计算takenTime,速度是(size / takenTime)

我希望它适合你

答案 1 :(得分:0)

WifiInfo.getLinkSpeed将为您提供当前WiFi网络的最大速度。您的实际wifi速度将低于此值,具体取决于您到接入点的距离,障碍物,干扰,......这是您在WiFi网络中的速度。如果您访问网络中的设备,则转移将是您的速度和其他设备速度之间的最小值。

如果您访问互联网,那么您的wifi网络已连接到互联网,您的速度将取决于所使用的技术(ADSL,有线电视,4G,卫星......)以及您的互联网提供商的容量(谁在你的连接的另一面)。这两个值通常都会随时间而变化,因为它们取决于使用模式(并发用户数,网络容量等)。

另外请记住,当连接到互联网时,您向其他设备发出请求(大多数时候是向服务器发送)。您获得的传输速度将是您的速度和速度之间的最小值。您正在联系的服务器。

总而言之,有太多未知元素可以预测您的网速。

但是你可以随时计算它,只需要做一些请求,测量你得到多少千字节(或兆字节),计算它所花费的时间并将它们除以另一个。这将是您当前特定连接的速度。

如果您想要更稳定/可信赖的值,则应多次重复此操作,并使用平均值。这就是速度测试仪(www.speedtest.net,testmy.net,...)的服务。

答案 2 :(得分:0)

检查互联网连接质量和流量的质量。这个库可能对你有所帮助..

Facebook - Network Connection Class

网络连接类是一个Android库,可让您了解当前用户的互联网连接质量。连接被分类为几个“连接类”,使其易于开发。该库通过聆听应用程序完成的现有互联网流量并在用户的连接质量发生变化时通知您来实现此目的。然后,开发人员可以使用此连接类信息并调整应用程序的行为(请求较低质量的图像或视频,节流类型提前等)。