Android 获取当前数据连接的状态 M

本文介绍如何在Android设备上监听网络状态的变化,包括移动数据连接和Wi-Fi连接的状态更新。提供了不同Android版本下获取当前活动SIM卡信息的方法,并展示了如何判断当前网络连接类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
         欢迎大家我分享和推荐好用的代码段~~
声明
         欢迎转载,但请保留文章原始出处:
         优快云
http://www.youkuaiyun.com
         雨季o莫忧离:http://blog.youkuaiyun.com/luckkof

正文

 

1.如果只需要监听Mobile State状态

通过监听

TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED

这条broadcast,

然后通过如下方式可以获取当前是哪张卡在建立数据链接:

GB,ICS,ICS2,JB版本请使用:

String state =intents.getStringExtra(Phone.STATE_KEY);

JB2,JB3,JB5版本请使用

String state =intents.getStringExtra(PhonConstants.STATE_KEY);

 

if(state.equals("CONNECTED")){

      SIMInfo si = SIMInfo.getSIMInfoBySlot(context, intent.getIntExtra              (Phone.GEMINI_SIM_ID_KEY,Phone.GEMINI_SIM_1));

          int simId = (int)si.mSimId;

          。。。。。

}

2.如果需要同时监听WIFIMobile State

可以监听

ConnectivityManager.CONNECTIVITY_ACTION这条广播

然后可以获取

NetworkInfo info = (NetworkInfo)intent.getExtra(ConnectivityManager.EXTRA_NETWORK_INFO);

 

在获取当前的网络类型

Type = info.getType();

通过判断Type

ConnectivityManager.TYPE_MOBILE还是ConnectivityManager.TYPE_WIFI

就知道当前是GPRS还是wifi链接上了。

 

NetworkInfo.State state = info.getState();

然后判断stateNetworkInfo.State.CONNECTED

还是NetworkInfo.State.DISCONNECTED


<think>好的,用户之前问过如何优化获取漫游状态的代码,现在又问了关于Android获取当前网络是否可用的方法。我需要先理解用户的需求。用户可能是在开发一个需要检测网络状态的应用程序,比如需要判断设备是否联网,或者区分是移动数据还是Wi-Fi。 首先,用户的问题比较简短,可能他们需要的是一个全面的方法,包括检查网络连接、网络类型以及处理权限问题。我需要确保回答涵盖这些方面,并且结构清晰,容易理解。 接下来,我需要回忆Android中常用的网络检测方法。通常,使用ConnectivityManager来检查网络状态。同时,要注意不同Android版本的区别,比如在Android 10及以上,某些方法被废弃,需要使用NetworkCapabilities代替。 然后,权限方面,需要提到ACCESS_NETWORK_STATE权限,并提醒用户在AndroidManifest.xml中添加。另外,在Android 10及更高版本,可能还需要处理后台访问位置的权限,这取决于是否需要更详细的网络信息。 还要考虑网络连接的有效性,比如设备是否真的可以访问互联网。可能需要使用NetworkCapabilities中的功能,比如NET_CAPABILITY_VALIDATED和NET_CAPABILITY_INTERNET来判断。 用户可能还关心如何处理不同的网络类型,比如Wi-Fi、移动数据、以太网等,所以需要给出示例代码来区分这些类型。同时,提醒用户注意飞行模式的影响,以及如何在代码中处理这种情况。 另外,用户可能对兼容性有要求,所以需要分别处理Android 6.0以上和以下的版本,使用不同的API方法。同时,异常处理也很重要,比如避免空指针异常,确保获取ConnectivityManager时不为null。 最后,总结最佳实践,包括权限声明、版本适配、有效性检查和日志记录,帮助用户避免常见的错误和问题。可能还需要提醒用户关于后台位置权限的变化,尤其是在较新的Android版本中,避免他们的应用出现权限问题。 检查是否有遗漏的部分,比如网络状态变化的监听,但用户的问题主要是获取当前状态,所以暂时不需要深入讨论监听器。确保回答的结构清晰,分步骤说明,代码示例正确,并且注意事项明确。这样用户可以根据步骤实现功能,同时避免常见的陷阱。</think>以下是Android中检测网络可用性的完整实现方案,分为基础检测、进阶判断和注意事项三个部分: --- ### 一、基础网络检测(连接状态) ```java // 需要权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> public static boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return false; // Android 10+ 推荐方式 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)); } // 兼容旧版本 else { NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnected(); } } ``` --- ### 二、进阶网络判断(有效性验证) ```java // 需要添加权限:<uses-permission android:name="android.permission.INTERNET" />(仅测试时) public static boolean isInternetAvailable() { try { // 使用Google的DNS服务进行验证 Process process = Runtime.getRuntime().exec("ping -c 1 8.8.8.8"); int exitValue = process.waitFor(); return (exitValue == 0); } catch (IOException | InterruptedException e) { return false; } } // 或者使用NetworkCapabilities的验证标志(API 23+) public static boolean isValidatedNetwork(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return false; Network network = cm.getActiveNetwork(); if (network == null) return false; NetworkCapabilities capabilities = cm.getNetworkCapabilities(network); return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } ``` --- ### 三、网络类型判断 ```java public static String getNetworkType(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return "DISCONNECTED"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Network network = cm.getActiveNetwork(); if (network == null) return "DISCONNECTED"; NetworkCapabilities capabilities = cm.getNetworkCapabilities(network); if (capabilities == null) return "UNKNOWN"; if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { return "WIFI"; } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { return "MOBILE"; } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { return "ETHERNET"; } } else { NetworkInfo info = cm.getActiveNetworkInfo(); if (info == null || !info.isConnected()) return "DISCONNECTED"; switch (info.getType()) { case ConnectivityManager.TYPE_WIFI: return "WIFI"; case ConnectivityManager.TYPE_MOBILE: return "MOBILE"; case ConnectivityManager.TYPE_ETHERNET: return "ETHERNET"; } } return "UNKNOWN"; } ``` --- ### 四、关键注意事项 1. **权限管理**: - 必须声明 `ACCESS_NETWORK_STATE` 权限 - Android 10+ 需要处理[后台位置权限](https://developer.android.com/training/location)(当使用精确网络信息时) 2. **飞行模式处理**: ```java public static boolean isAirplaneModeOn(Context context) { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } ``` 3. **实时监听网络变化**: ```java // 注册广播接收器 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); context.registerReceiver(networkChangeReceiver, filter); // 接收器实现 private final BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 处理网络变化事件 } }; ``` --- ### 五、最佳实践建议 1. **混合验证策略**: ```java public static boolean isRealNetworkAvailable(Context context) { return isNetworkAvailable(context) && (isInternetAvailable() || isValidatedNetwork(context)); } ``` 2. **兼容性处理**: - 使用 `NetworkCapabilities` (API 21+) 替代已弃用的 `NetworkInfo` - 对于旧版本系统保持向后兼容 3. **错误日志记录**: ```java public static void logNetworkState(Context context) { String state = isNetworkAvailable(context) ? "CONNECTED" : "DISCONNECTED"; String type = getNetworkType(context); Log.d("NetworkState", String.format("%s via %s", state, type)); } ``` --- 通过这套方案,可以实现:基础连接检测 → 网络类型判断 → 真实网络有效性验证 → 状态变化监听的全流程管理,建议根据具体业务需求选择适当的检测级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值