【android 应用】 获取网络连接方式:有线、wifi、或者3g、4g、Mac地址获取、wifi连接

最近在做数据上报功能,其中获取网络连接方式的方法在这里总结下。

话不多说,上代码。

一、获取wifi和数据网络的方式。

    public static String getNetStatus(Context context) {
        ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connManager == null) {
            return NETWORK_NONE;
        }
        NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo();
        if (activeNetInfo == null || !activeNetInfo.isAvailable()) {
            return NETWORK_NONE;
        }

        // 判断是不是连接的是不是wifi
        NetworkInfo wifiInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (null != wifiInfo) {
            NetworkInfo.State state = wifiInfo.getState();
            if (null != state) {
                if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
                    return NETWORK_WIFI;
                }
            }
        }

        // 如果不是wifi,则判断当前连接的是运营商的哪种网络2g、3g、4g等
        NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        if (null != networkInfo) {
            NetworkInfo.State state = networkInfo.getState();
            String strSubTypeName = networkInfo.getSubtypeName();
            if (null != state) {
                if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
                    switch (activeNetInfo.getSubtype()) {
                        //如果是2g类型
                        case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
                        case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
                        case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
                        case TelephonyManager.NETWORK_TYPE_1xRTT:
                        case TelephonyManager.NETWORK_TYPE_IDEN:
                            return NETWORK_2G;
                        //如果是3g类型
                        case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
                        case TelephonyManager.NETWORK_TYPE_UMTS:
                        case TelephonyManager.NETWORK_TYPE_EVDO_0:
                        case TelephonyManager.NETWORK_TYPE_HSDPA:
                        case TelephonyManager.NETWORK_TYPE_HSUPA:
                        case TelephonyManager.NETWORK_TYPE_HSPA:
                        case TelephonyManager.NETWORK_TYPE_EVDO_B:
                        case TelephonyManager.NETWORK_TYPE_EHRPD:
                        case TelephonyManager.NETWORK_TYPE_HSPAP:
                            return NETWORK_3G;
                        //如果是4g类型
                        case TelephonyManager.NETWORK_TYPE_LTE:
                            return NETWORK_4G;
                        default:
                            if (strSubTypeName.equalsIgnoreCase("TD-SCDMA") || strSubTypeName.equalsIgnoreCase("WCDMA") || strSubTypeName.equalsIgnoreCase("CDMA2000")) {
                                return NETWORK_3G;
                            } else {
                                return strSubTypeName;
                            }
                    }
                }
            }
        }
        return NETWORK_NONE;
    }

二、获取有线网络和wifi的方式

    private String getNetStatus(Context context) {
        int networkType;
        final ConnectivityManager connectivityManager= (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
        final NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
        networkType=networkInfo.getType();
        Loger.d(TAG, "network type:"+networkType);
        if(networkType == ConnectivityManager.TYPE_WIFI){
            return "wifi";
        }else if((networkType == ConnectivityManager.TYPE_ETHERNET)){
            return "ethernet";
        }else{
            return "wifi";
        }
    }

三、获取wifi信息,以及wifi连接

//权限
android.permission.ACCESS_WIFI_STATE 
android.permission.CHANGE_WIFI_STATE 
android.permission.WAKE_LOCK 

//wifi对象
WifiManager mWifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);

//开关wifi
if (wifiManager.isWifiEnabled()) {
    wifiManager.setWifiEnabled(false);
} else {
    wifiManager.setWifiEnabled(true);
}

//wifi信息
if (mWifi.isWifiEnabled()) {
    WifiInfo wifiInfo = mWifi.getConnectionInfo();
    String netName = wifiInfo.getSSID(); //获取被连接网络的名称
    String netMac =  wifiInfo.getBSSID(); //获取被连接网络的mac地址
    String localMac = wifiInfo.getMacAddress();// 获得本机的MAC地址
}

四、获取wifi mac地址

//第一种方式
WifiManager wifiManager=(WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo=wifiManager.getConnectionInfo();
String mac=wifiInfo.getMacAddress();

//第二种方式
public static String getMacAddr() {
    try {
        return loadFileAsString("/sys/class/net/wlan0/address")
                .toUpperCase().substring(0, 17);
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
}
private static String loadFileAsString(String filePath)
        throws java.io.IOException {
    StringBuffer fileData = new StringBuffer(1000);
    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    char[] buf = new char[1024];
    int numRead = 0;
    while ((numRead = reader.read(buf)) != -1) {
        String readData = String.valueOf(buf, 0, numRead);
        fileData.append(readData);
    }
    reader.close();
    return fileData.toString();
}

//第三种方式
NetworkInterface networkInterface = NetworkInterface.getByName("wlan0");
return ConvertMacAddressBytesToString(networkInterface.getHardwareAddress());

//第四种方式
public static String getMacAddr() {  
    try {  
        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());  
        for (NetworkInterface nif : all) {  
            if (!nif.getName().equalsIgnoreCase("wlan0")) continue;  

            byte[] macBytes = nif.getHardwareAddress();  
            if (macBytes == null) {  
                return "";  
            }  

            StringBuilder res1 = new StringBuilder();  
            for (byte b : macBytes) {  
                res1.append(String.format("%02X:",b));  
            }  

            if (res1.length() > 0) {  
                res1.deleteCharAt(res1.length() - 1);  
            }  
            return res1.toString();  
        }  
    } catch (Exception ex) {  
    }  
    return "02:00:00:00:00:00";  
}

兼容实例

        /**
         * Android 6.0 之前(不包括6.0)获取mac地址
         * 必须的权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
         * @param context * @return
         */
        private static String getMacDefault(Context context) {
            String mac = "";
            if (context == null) {
                return mac;
            }
            WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            WifiInfo info = null;
            try {
                info = wifi.getConnectionInfo();
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (info == null) {
                return null;
            }
            mac = info.getMacAddress();
            if (!TextUtils.isEmpty(mac)) {
                mac = mac.toUpperCase(Locale.ENGLISH);
            }
            return mac;
        }

        /**
         * Android 6.0-Android 7.0 获取mac地址
         */
        private static String getMacAddress() {
            String macSerial = null;
            String str = "";

            try {
                Process pp = Runtime.getRuntime().exec("cat /sys/class/net/wlan0/address");
                InputStreamReader ir = new InputStreamReader(pp.getInputStream());
                LineNumberReader input = new LineNumberReader(ir);

                while (null != str) {
                    str = input.readLine();
                    if (str != null) {
                        macSerial = str.trim();//去空格
                        break;
                    }
                }
            } catch (IOException ex) {
                // 赋予默认值
                ex.printStackTrace();
            }

            return macSerial;
        }

        /**
         * Android 7.0之后获取Mac地址
         * 遍历循环所有的网络接口,找到接口是 wlan0
         * 必须的权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
         * @return
         */
        private static String getMacFromHardware() {
            String wlan0Mac = null;
            try {
                List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
                for (NetworkInterface nif : all) {
                    if (!nif.getName().equalsIgnoreCase("wlan0")) {
                        continue;
                    }

                    byte[] macBytes = nif.getHardwareAddress();
                    if (macBytes == null) {
                        Loger.e(TAG, nif.getName() + " getHardwareAddress null.");
                        return null;
                    }

                    StringBuilder res1 = new StringBuilder();
                    for (byte b : macBytes) {
                        res1.append(String.format("%02X:", b));
                    }

                    if (res1.length() > 0) {
                        res1.deleteCharAt(res1.length() - 1);
                    }
                    wlan0Mac = res1.toString();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return wlan0Mac;
        }

        /**
         * 获取mac地址(适配所有Android版本)
         * @return
         */
        private String getWlan0Mac(Context mContext){
            String mac = "";
            Log.d(TAG, "getWlan0Mac: once start");
            mac = getMacDefault(mContext);
            if (StringUtils.isNullOrEmpty(mac) || mac.equals("02:00:00:00:00:00")) {
                Log.d(TAG, "getMacDefault: is null");
                mac = getMacAddress();
            }
            if (StringUtils.isNullOrEmpty(mac) || mac.equals("02:00:00:00:00:00")) {
                Log.d(TAG, "getMacAddress: is null");
                mac = getMacFromHardware();
            }
            Log.d(TAG, "getWlan0Mac: end");
            return mac;
        }

五、根据淘宝网返回获取位置信息

package com.android.vps.basic.protocol;

import com.android.vps.basic.business.AreaInfo;
import com.android.vpsc.publicapi.Loger;
import com.google.gson.Gson;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class TaobaoClient {
    private static TaobaoClient instance;
    private AreaInfo mAreaInfo = null;
    private String TAG = "TaobaoClient";
    private static final String TAOBAO_URL = "http://ip.taobao.com/service/getIpInfo.php?ip=myip";
    private TaobaoClient(){}

    public synchronized static TaobaoClient getInstance() {
        if (null == instance) {
            instance = new TaobaoClient();
        }
        return instance;
    }

    public AreaInfo getAreaInfo() {
        synchronized (this) {
            if (null != mAreaInfo) {
                return mAreaInfo;
            }
            try {
                OkHttpClient httpClient = new OkHttpClient();
                Request request = new Request.Builder()
                        .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0")
                        .url(TAOBAO_URL).build();
                Response response = httpClient.newCall(request).execute();
                if (response.code() != 200) {
                    Loger.e(TAG, "got responsecode " + response.code() + " from taobao.");
                    return null;
                }
                String json = response.body().string();
                Loger.d(TAG, "taobao reply: " + json);
                mAreaInfo = new Gson().fromJson(json, AreaInfo.class);
                return mAreaInfo;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}

网上这类资料很多,博客写下来的目的是,方便自己查阅。以后网络连接可能也会补充到这个博客中来。

发布了61 篇原创文章 · 获赞 45 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/twk121109281/article/details/102725135