简单的测试安卓网速

简单的测试安卓网速

package com.qzx.testnetspeed;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.TrafficStats;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Point;
import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private TextView tv_upload=null;
    private TextView tv_download=null;
    private TextView tv_allInfo=null;
    private TextView tv_netConnect=null;
    private EditText et_uid=null;
    private TextView tv_uid=null;
    private TextView tv_packageName=null;

    //反馈类型
    private static final int NETWORK_INVALID=0;
    private static final int NETWORK_WIFI=1;
    private static final int NETWORK_2G=2;
    private static final int NETWORK_3G=3;
    private static final int NETWORK_4G=4;

    //移动数据网络信息
    public static final int NETWORK_TYPE_1xRTT = 7;  
    public static final int NETWORK_TYPE_CDMA = 4;  
    public static final int NETWORK_TYPE_EDGE = 2;  
    public static final int NETWORK_TYPE_EHRPD = 14;  
    public static final int NETWORK_TYPE_EVDO_0 = 5;  
    public static final int NETWORK_TYPE_EVDO_A = 6;  
    public static final int NETWORK_TYPE_EVDO_B = 12;  
    public static final int NETWORK_TYPE_GPRS = 1;  
    public static final int NETWORK_TYPE_HSDPA = 8;  
    public static final int NETWORK_TYPE_HSPA = 10;  
    public static final int NETWORK_TYPE_HSPAP = 15;  
    public static final int NETWORK_TYPE_HSUPA = 9;  
    public static final int NETWORK_TYPE_IDEN = 11;  
    public static final int NETWORK_TYPE_LTE = 13;  
    public static final int NETWORK_TYPE_UMTS = 3;  
    public static final int NETWORK_TYPE_UNKNOWN = 0;

    private String netType;

    private long total_preRx;
    private long total_nowRx;
    private long total_resultRx;

    private long total_preTx;
    private long total_nowTx;
    private long total_resultTx;

    private static final int UPDATE_MSG=0;
    final Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case UPDATE_MSG:
                total_nowRx=TrafficStats.getTotalRxBytes();
                total_resultRx=total_nowRx-total_preRx;
                Log.d("zbv", "total_resultRx="+total_resultRx);
                tv_download.setText(handleUnit(total_resultRx));
                //修改前后数据接收流量信息
                total_preRx=total_nowRx;
                total_nowTx=TrafficStats.getTotalTxBytes();
                total_resultTx=total_nowTx-total_preTx;
                Log.d("zbv", "total_resultTx="+total_resultTx);
                tv_upload.setText(handleUnit(total_resultTx));
                //修改前后数据传送流量信息
                total_preTx=total_nowTx;
                break;

            default:
                break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取当前手机的屏幕大小单位是像素
        WindowManager wm=(WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
        Point point=new Point();
        wm.getDefaultDisplay().getSize(point);
        Toast.makeText(this, "width="+point.x+"px;height="+point.y+"px", 0).show();

        //监听网络状态改变
        IntentFilter filter=new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        this.registerReceiver(netChangeReceiver, filter);

        tv_upload=(TextView) findViewById(R.id.tv_upload);
        tv_download=(TextView) findViewById(R.id.tv_download);
        tv_allInfo=(TextView) findViewById(R.id.tv_allInfo);
        tv_netConnect=(TextView) findViewById(R.id.tv_netConnect);
        et_uid=(EditText) findViewById(R.id.et_uid);
        tv_uid=(TextView) findViewById(R.id.tv_uid);
        tv_packageName=(TextView) findViewById(R.id.tv_packageName);

        switch (checkNetworkConnected()) {
        case 0:
            netType="无法连接上任何网络";
            break;
        case 1:
            netType="连接上wifi";
            break;
        case 2:
            netType="连接上2G";
            break;
        case 3:
            netType="连接上3G";
            break;
        case 4:
            netType = "连接上4G";
            break;
        }


        tv_netConnect.setText(netType);

        getTraffics();

        fetchTotalTraffic();

//      getAllApplication();

    }

    private BroadcastReceiver netChangeReceiver=new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)){
                Log.d("zbv", "网络状态改变了");
            }
        }
    };

    /**
     * 检测网络连接并且检测连接成功的简单粗分类型
     * */
    private int checkNetworkConnected(){
        ConnectivityManager cManager=(ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo=cManager.getActiveNetworkInfo();
        if(networkInfo!=null&&networkInfo.isConnected()){
            String typeNet=networkInfo.getTypeName();
            if(typeNet.equals("WIFI")){
                return NETWORK_WIFI;
            }else if(typeNet.equals("MOBILE")){
                switch (networkInfo.getSubtype()) {
                 case TelephonyManager.NETWORK_TYPE_CDMA:  // telcom  
                 case TelephonyManager.NETWORK_TYPE_1xRTT: // telecom  
                 case TelephonyManager.NETWORK_TYPE_GPRS:  // unicom  
                 case TelephonyManager.NETWORK_TYPE_EDGE:  // cmcc  
                     return NETWORK_2G;  
                 case TelephonyManager.NETWORK_TYPE_EHRPD:  // telecom  
                 case TelephonyManager.NETWORK_TYPE_EVDO_0: // telecom  
                 case TelephonyManager.NETWORK_TYPE_EVDO_A: // telecom 3.5G  
                 case TelephonyManager.NETWORK_TYPE_EVDO_B: // telecom 3.5G  
                 case TelephonyManager.NETWORK_TYPE_HSPA:   // unicom  
                 case TelephonyManager.NETWORK_TYPE_HSPAP:  // unicom  
                 case TelephonyManager.NETWORK_TYPE_HSDPA:  // unicom 3.5G  
                 case TelephonyManager.NETWORK_TYPE_HSUPA:  // unicom 3.5G  
                 case TelephonyManager.NETWORK_TYPE_UMTS:   // unicom  
                     return NETWORK_3G;  
                 case TelephonyManager.NETWORK_TYPE_LTE:  
                     return NETWORK_4G; 
                }
            }
        }
        return NETWORK_INVALID;
    }

    /**
     * 总的流量:
     *       上传和下载
     *       
     * wifi流量
     * 
     * 移动网络流量
     * 
     * 可能包含本地数据传输的流量
     * */
    private void getTraffics(){
        long rx_total=TrafficStats.getTotalRxBytes();
        long tx_total=TrafficStats.getTotalTxBytes();
        if(tx_total==TrafficStats.UNSUPPORTED&&rx_total==TrafficStats.UNSUPPORTED){
            Toast.makeText(this, "当前设备不支持总流量查询", Toast.LENGTH_LONG).show();
        }

        long rx_mobile=TrafficStats.getMobileRxBytes();
        long tx_mobile=TrafficStats.getTotalTxBytes();
        if(rx_mobile==TrafficStats.UNSUPPORTED&&tx_mobile==TrafficStats.UNSUPPORTED){
            Toast.makeText(this, "当前设备不支持移动网络流量查询", Toast.LENGTH_LONG).show();
        }

        long rx_wifi=rx_total-rx_mobile;
        long tx_wifi=tx_total-tx_mobile;

        tv_allInfo.setText("总接收流量="+rx_total+"b/s;wifi的接收流量="+rx_wifi+"b/s;移动网络的接收流量="+rx_mobile+"b/s;"+
                           "总传送流量="+tx_total+"b/s;wifi的传送流量="+tx_wifi+"b/s;移动网络的传送流量="+tx_mobile+"b/s;");

    }

    /**
     * 使用uid获取指定包名的应用的流量情况
     * 某个应用的网络流量数据保存在系统的 
     * /proc/uid_stat/$UID/tcp_rcv | tcp_snd文件中 
     * */
    private void getTrafficsThroughUID(int uid){
        String rx_name="/proc/uid_stat/"+uid+"/tcp_rcv";
        String tx_name="/proc/uid_stat/"+uid+"/tcp_snd";
        long uid_rx=TrafficStats.getUidRxBytes(uid);
        long uid_tx=TrafficStats.getUidTxBytes(uid);
        if(uid_rx==TrafficStats.UNSUPPORTED&&uid_tx==TrafficStats.UNSUPPORTED){
            Toast.makeText(this, "当前设备不支持总流量查询", Toast.LENGTH_LONG).show();
        }
        RandomAccessFile raFile_rx=null;
        RandomAccessFile raFile_tx=null;
        try {
            raFile_rx=new RandomAccessFile(rx_name,"r");
            raFile_tx=new RandomAccessFile(tx_name,"r");
            uid_rx=Long.parseLong(raFile_rx.readLine());
            uid_tx=Long.parseLong(raFile_tx.readLine());

            tv_uid.setText("uid_rx="+handleUnit(uid_rx)+";uid_tx="+handleUnit(uid_tx));

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NumberFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(raFile_rx!=null||raFile_tx!=null){
                try {
                    raFile_rx.close();
                    raFile_tx.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * 隔1s更新一次总的数据流量
     * */
    private void fetchTotalTraffic(){
        new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                mHandler.sendEmptyMessage(UPDATE_MSG);
            }
        }, 1000,1000);
    }

    /**
     * 处理字节的单位转换
     * */
    private String handleUnit(long result) {
        String txt = "";
        double loadSpeed;
        if (result < 1024) {
            loadSpeed = result;
            txt = String.format("%1$.2fb/s", loadSpeed);
        } else if (result >= 1024 && result < (1024 * 1024)) {
            loadSpeed = Math.round(result / 1024);
            txt = String.format("%1$.2fkb/s", loadSpeed);
        } else if (result > 1024 * 1024) {
            loadSpeed = Math.round(result / 1024 / 1024);
            txt = String.format("%1$.2fM/s", loadSpeed);
        }
        return txt;
    }

    /**
     * 依据包名获取uid
     * */
    private int getUIDFromPackageName(Context context,String packageName){
        int uid=-1;
        PackageManager pManager=context.getPackageManager();
        try {
            PackageInfo packageInfo=pManager.getPackageInfo(packageName, PackageManager.GET_META_DATA);
            uid=packageInfo.applicationInfo.uid;
        } catch (NameNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.d("zbv", "uid="+uid);
        return uid;
    }

    /**
     * Button
     * */
    public void seekUidInfo(View view){
        getTrafficsThroughUID(getUIDFromPackageName(this, et_uid.getText().toString()));
    }

    /**
     * 获取所有应用
     * */
    public void getAllApplication(){
        PackageManager pManager=this.getPackageManager();
        List<PackageInfo> list=pManager.getInstalledPackages(PackageManager.GET_META_DATA);
        StringBuffer sb=new StringBuffer();
        for (PackageInfo packageInfo : list) {
            String pName=packageInfo.applicationInfo.packageName;
            sb.append(pName+"\n");
        }
        tv_packageName.setText(sb.toString());
    }

}

设计的知识点归纳:

一、uid和uuid以及pid

PID和UID和UUID:
PID:为Process Identifier,PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在android系统中一般不会把已经kill掉的进程ID重新分配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大。

UID:一般理解为User Identifier,UID在linux中就是用户的ID,表明时哪个用户运行了这个程序,主要用于权限的管理。而在android 中又有所不同,因为android为单用户系统,这时UID 便被赋予了新的使命,数据共享,为了实现数据共享,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID。(当然这也就表明了一个问题,android只能时单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。
因此在android中PID,和UID都是用来识别应用程序的身份的,但UID是为了不同的程序来使用共享的数据。

UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。

二、我认为的重点

首先是通过包名获取uid方法为:getUIDFromPackageName(Context context,String packageName)
然后就是检测移动网络的区分:checkNetworkConnected()
最后就是获取单个应用的流量统计:getTrafficsThroughUID(int uid)

注意的是:安卓23即以上即安卓6.0有另外一套api供更加全面友好的使用即:NetworkStatsManager

^–^

猜你喜欢

转载自blog.csdn.net/zb52588/article/details/79718094
今日推荐