您的位置:首页 > 移动开发 > Android开发

简单的测试安卓网速

2018-03-27 19:50 197 查看

简单的测试安卓网速

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(packageN
af32
ame, 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

^–^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android