`

android 网络检测

阅读更多

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import java.util.List;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

/**
 * 网络检测
 *
 * @author Jekey Lingz
 *
 */
public class NetworkUtil {

    Context context;

    public NetworkUtil(Context context) {
        this.context = context;
    }

    /**
     * Network status
     */
    public static final int NO_NETWORK = -1,
    /**
     * Network status
     */
    WIFI_ON = 1,
    /**
     * Network status
     */
    MOBILE_ON = 3,
    /**
     * Network status
     */
    ETH_ON = 5,
    /**
     * Network status
     */
    WIMAX_ON = 6;

    public int getCurrentNetStatus() {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm != null) {
            NetworkInfo ni = cm.getActiveNetworkInfo();

            if (ni != null) {
                if (ni.isConnected()) {
                    int t = ni.getType();
                    if (t == ConnectivityManager.TYPE_MOBILE)
                        return MOBILE_ON;
                    if (t == ConnectivityManager.TYPE_WIFI)
                        return WIFI_ON;
                    if (t == ConnectivityManager.TYPE_WIMAX)
                        return WIMAX_ON;

                    return ETH_ON;
                }
            }
        }
        return NO_NETWORK;
    }

    public int getWifiStrength() {
        // Wifi的连接速度及信号强度:
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
        // WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        WifiInfo info = wifiManager.getConnectionInfo();
        if (info.getBSSID() != null) {
            // 链接信号强度
            int strength = WifiManager.calculateSignalLevel(info.getRssi(), 5);
            return strength;
        }
        return 0;
    }

    public MyNetworkInfo getNetworkInfo() {
        try {
            int ns = getCurrentNetStatus();
            switch (ns) {
            case WIFI_ON:
                return getWifiInfo();
            case MOBILE_ON:
                return getMobileInfo();
            case ETH_ON:
                return new MyNetworkInfo("eth", "", 5);
            default:
                return new MyNetworkInfo("off", "", 0);
            }
        } catch (Exception e) {
            // TODO: handle exception
            return new MyNetworkInfo("off", "", 0);
        }
       
    }

    int rssi = 0;

    public MyNetworkInfo getMobileInfo() {

        // Wifi的连接速度及信号强度:
        TelephonyManager tm = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        // WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int tdata = tm.getDataState();
        int ss = 0;
        String t2 = "";
        if (tdata == TelephonyManager.DATA_CONNECTED) {
            List<NeighboringCellInfo> infos = tm.getNeighboringCellInfo();
            // Log.v("AAA",""+infos.size());

            tm.listen(new PhoneStateListener() {
                @Override
                public void onSignalStrengthChanged(int asu) {
                    // TODO Auto-generated method stub
                    super.onSignalStrengthChanged(asu);
                    rssi = asu;
                }
            }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
            /*
             * for (NeighboringCellInfo info : infos) { // 获取邻居小区号 // int
             * cid=info.getCid(); // 获取邻居小区LAC,LAC: //
             * 位置区域码。为了确定移动台的位置,每个GSM/PLMN的覆盖区都被划分成许多位置区,LAC则用于标识不同的位置区。 //
             * info.getLac(); // info.getNetworkType(); // info.getPsc(); //
             * 获取邻居小区信号强度 int rssi=info.getRssi(); int s =
             * WifiManager.calculateSignalLevel(rssi, 5); Log.v("AAA",
             * String.format("{%d,%d}",rssi,s)); if (s > ss) ss = s; }
             */
            // 在中国,联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO
            ss = WifiManager.calculateSignalLevel(rssi, 5);
            int nt = tm.getNetworkType();
            if (nt == TelephonyManager.NETWORK_TYPE_UMTS
                    || nt == TelephonyManager.NETWORK_TYPE_HSDPA
                    || nt == TelephonyManager.NETWORK_TYPE_EVDO_0
                    || nt == TelephonyManager.NETWORK_TYPE_EVDO_A
            /* || nt==TelephonyManager.NETWORK_TYPE_EVDO_B */) {
                t2 = "3G";
            } else {
                t2 = "2G";
            }
        }

        MyNetworkInfo res = new MyNetworkInfo("mobile", t2, ss);
        return res;

    }

    public MyNetworkInfo getWifiInfo() {
        int ss = 0;
        WifiManager wifiManager = (WifiManager) context
                .getSystemService(Context.WIFI_SERVICE);
        // WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        WifiInfo info = wifiManager.getConnectionInfo();
        if (info.getBSSID() != null) {
            // 链接信号强度
            ss = WifiManager.calculateSignalLevel(info.getRssi(), 5);

        }

        return new MyNetworkInfo("wifi", "", ss);
    }

    public static class MyNetworkInfo {
        public String net_type = "", net_type2 = "";
        public int strength = 0;

        public MyNetworkInfo(String net_type, String net_type2, int strength) {
            super();
            this.net_type = net_type;
            this.net_type2 = net_type2;
            this.strength = strength;
        }

    }

    /**
     * Get local ip address.
     *
     * @return
     */
    public String getLocalIp() {
        //
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm != null
                && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI) {
            WifiManager wifi = (WifiManager) context
                    .getSystemService(Context.WIFI_SERVICE);
            WifiInfo info = wifi.getConnectionInfo();
            int ip = info.getIpAddress();
            return (ip & 255) + "." + ((ip >> 8) & 255) + "."
                    + ((ip >> 16) & 255) + "." + ((ip >> 24) & 255);
        }

        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface
                    .getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf
                        .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()
                            && inetAddress.isSiteLocalAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {
            ex.printStackTrace();
        }
        return null;
    }

}

分享到:
评论

相关推荐

    android检测网络两个方法

    罗列了android常用两种检测网络方法,在工作线程中定时执行检测操作

    Android-NetworkState一个轻量级的网络状态监听库方便实用

    在Android应用开发中,网络状态的监测是必不可少的一部分,它涉及到应用能否正常访问网络资源,如加载图片、发送请求、接收...这个库是Android网络编程中的一个实用工具,对于提高开发效率和应用质量具有显著的作用。

    android 检测网络状态

    ### Android检测网络状态知识点详解 在Android开发过程中,检测设备的网络状态是一项基本且重要的功能。这不仅可以帮助开发者判断应用程序是否应该执行某些依赖于网络的操作(例如数据同步、下载资源等),还可以...

    Android网络连接检测代码

    ### Android网络连接检测知识点 #### 一、网络连接检测的重要性 在开发Android应用时,确保设备具有有效的网络连接是至关重要的。很多应用依赖于互联网来提供服务或功能,例如社交媒体应用、在线游戏、天气预报...

    Android网络状态检测

    在Android应用开发中,了解如何检测网络状态是至关重要的,因为网络连接对于大多数现代应用程序来说是必不可少的。本文将深入探讨Android系统中的网络状态检测,以及如何结合`DialogFragment`来优雅地处理用户界面...

    Android网络相关问题集合

    ### Android网络检测与权限 在Android开发中,检测设备是否连接到互联网是常见需求之一。以下代码片段展示了一种方法来判断设备当前是否有网络连接,并检查是否处于漫游状态。 #### 检测网络连接 ```java public ...

    android实时网络质量检测

    在Android平台上进行实时网络质量检测是一项重要的任务,它有助于开发者评估应用性能,优化网络请求,以及为用户提供流畅的网络体验。通常,我们可以利用系统内置的`ping`命令来实现这一功能。`ping`是一个用于测试...

    Android 可以检测网络的例子,可以检测出连接的不可用wifi

    通过对这个项目的研究,开发者可以深入理解Android网络监测的实现细节,并将其应用到自己的项目中。 总之,Android提供了一系列的API来帮助开发者检测和管理网络状态。通过结合使用`ConnectivityManager`和实际的...

    Android 判断当前网络是否可用简单实例

    Android 判断当前网络是否可用简单实例 用户手机当前网络可用:WIFI、2G/3G网络,用户打开与不打开网络,和是否可以用是两码事。可以使用指的是:用户... * 检测当的网络(WLAN、3G/2G)状态 * @param context Contex

    Android移动开发检测网络状态并使用BroadcastReceiver(广播接收者)进行接收网络变化的后续处理

    在Android移动应用开发中,了解如何检测网络状态以及利用BroadcastReceiver来监听网络变化是至关重要的。BroadcastReceiver是一种组件,它可以监听系统或应用广播事件,并在接收到特定广播时执行相应的操作。以下是...

    Android终端检测

    逻辑组件图展示了系统各部分的相互依赖关系,包括视频播放模块、网络检测模块、用户界面模块和数据处理模块等,这些模块协同工作以完成整个检测流程。 2.2 序列图 2.2.1 播放检测 播放检测的序列图详细描绘了从用户...

    Android代码-检测网络是否正常

    运行于安卓上,检测是否能正常初始化“网络定位”功能的小工具。 简介 由于有厂商博弈与大环境因素的复杂情况,国行安卓手机/平板的“网络定位”有许多是不能正常工作的,这带来的后果是包括HTML5网络定位不能...

    Android网络连接检测判断实例代码.rar

    Android网络连接检测判断实例代码,通过连接到指定网址的URL,判断是否有可用的网络连接。

    android网络开发与应用实战详解源码

    《Android网络开发与应用实战详解》一书深入浅出地介绍了Android系统中如何实现网络通信,并提供了丰富的源码示例。这本书涵盖的内容广泛,包括基础的HTTP请求、数据解析、网络状态管理以及高级的WebSocket通信和...

    安卓Android源码——网络连接状态检测.rar

    在安卓(Android)开发中,了解...通过学习这份源码,开发者不仅可以理解网络状态检测的原理,还能提升自己在Android网络编程方面的技能。在实际应用中,开发者应遵循最佳实践,以确保应用在网络环境下的稳定性和性能。

    android检测信号强度

    在Android开发中,检测设备的信号强度是一项重要的功能,尤其是在需要根据网络状况调整应用行为的应用程序中。本篇文章将详细介绍如何在Android应用中实现信号强度的检测。 #### 检测原理 信号强度通常指的是移动...

    android判断网络端口是否可达

    在Android开发中,有时我们需要检测一个特定的网络端口是否可以正常通信,例如,确认服务器是否在线,或者某个服务是否已经启动。这时,我们可以利用Java的Socket编程来实现这一功能。下面将详细介绍如何通过Socket...

    Android 入侵检测

    2. **入侵检测方法**:详述如何利用Android的API和日志来检测异常行为,可能包括网络监控、系统调用分析等。 3. **工具应用**:推荐一些流行的Android IDS工具,如Drozer、AndroGuard或MobSF,它们可以帮助开发者...

    精通android网络开发

    "精通Android网络开发"意味着你需要深入理解网络通信的基本原理,并能熟练运用各种技术来实现Android应用与服务器之间的数据交换。以下是一些关于Android网络开发的重要知识点: 1. **HTTP/HTTPS协议**:Android...

    Android中wifi检测

    本文将深入探讨如何在Android应用中实现WiFi检测,包括使用`WifiManager`接口以及处理网络权限。 首先,我们需要理解`WifiManager`是Android提供的一个系统服务,用于管理设备上的WiFi连接。开发者可以通过调用`...

Global site tag (gtag.js) - Google Analytics