我不希望我的用户甚至尝试下载某些东西,除非他们已经连接了Wi-Fi。但是,我似乎只能判断是否启用了Wi-Fi,但他们仍然可以建立3G连接。
android.net.wifi.WifiManager m = (WifiManager) getSystemService(WIFI_SERVICE);
android.net.wifi.SupplicantState s = m.getConnectionInfo().getSupplicantState();
NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(s);
if (state != NetworkInfo.DetailedState.CONNECTED) {
return false;
}
然而,国家不是我所期望的。即使连接了Wi-Fi,我也会将OBTAINING_IPADDR
作为状态。
答案 0 :(得分:451)
您应该能够使用ConnectivityManager来获取Wi-Fi适配器的状态。从那里你可以check if it is connected or even available。
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWifi.isConnected()) {
// Do whatever
}
注意:应该注意(对于我们这里的n00bies)您需要添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
到你的
AndroidManifest.xml ,以便工作。
NOTE2 :public NetworkInfo getNetworkInfo (int networkType)
现已弃用:
此方法在API级别23中已弃用。此方法不允许 支持相同类型的多个连接网络。使用 改为使用getAllNetworks()和getNetworkInfo(android.net.Network)。
NOTE3 :public static final int TYPE_WIFI
现已弃用:
此常量在API级别28中已弃用。 应用程序应使用NetworkCapabilities.hasTransport(int)或requestNetwork(NetworkRequest,NetworkCallback)来请求适当的网络。支持运输。
答案 1 :(得分:60)
由于 API-23 中的 NetworkInfo.isConnected()方法现已已弃用,因此以下是检测Wi-的方法Fi适配器已打开,并使用WifiManager连接到接入点:
private boolean checkWifiOnAndConnected() {
WifiManager wifiMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);
if (wifiMgr.isWifiEnabled()) { // Wi-Fi adapter is ON
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
if( wifiInfo.getNetworkId() == -1 ){
return false; // Not connected to an access point
}
return true; // Connected to an access point
}
else {
return false; // Wi-Fi adapter is OFF
}
}
答案 2 :(得分:34)
我只使用以下内容:
SupplicantState supState;
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
supState = wifiInfo.getSupplicantState();
在调用getSupplicantState();
时,将返回其中一个状态相关 - 协会已完成。
关联 - 尝试与之关联 接入点。
已完成 - 所有身份验证 完成。
DISCONNECTED - 此状态表示 该客户端没有关联,但是 可能会开始寻找访问权限 点。
DORMANT - 一个Android添加状态 在客户发布时报告 显式DISCONNECT命令。
FOUR_WAY_HANDSHAKE - WPA四向键 握手正在进行中。
GROUP_HANDSHAKE - WPA组密钥 握手正在进行中。
非活动 - 非活动状态。
INVALID - 应该的伪状态 通常永远不会被看到。
扫描 - 扫描网络。
UNINITIALIZED - 没有联系。
答案 3 :(得分:18)
我在我的应用中使用此功能来检查活动网络是否为Wi-Fi:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI)
{
// Do your work here
}
答案 4 :(得分:17)
我看了几个像这样的问题并提出了这个问题:
ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo mobile = connManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isConnected()){
// If Wi-Fi connected
}
if (mobile.isConnected()) {
// If Internet connected
}
我使用if for license check in Root Toolbox PRO,它看起来效果很好。
答案 5 :(得分:6)
虽然Jason's answer是正确的,但现在getNetWorkInfo(int)是一种不推荐使用的方法。所以,下一个函数将是一个不错的选择:
public static boolean isWifiAvailable (Context context)
{
boolean br = false;
ConnectivityManager cm = null;
NetworkInfo ni = null;
cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
ni = cm.getActiveNetworkInfo();
br = ((null != ni) && (ni.isConnected()) && (ni.getType() == ConnectivityManager.TYPE_WIFI));
return br;
}
答案 6 :(得分:3)
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
boolean is3g = manager.getNetworkInfo(
ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
boolean isWifi = manager.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
Log.v("", is3g + " ConnectivityManager Test " + isWifi);
if (!is3g && !isWifi) {
Toast.makeText(
getApplicationContext(),
"Please make sure, your network connection is ON ",
Toast.LENGTH_LONG).show();
}
else {
// Put your function() to go further;
}
答案 7 :(得分:3)
使用WifiManager
即可:
WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE);
if (wifi.getConnectionInfo().getNetworkId() != -1) {/* connected */}
方法getNeworkId仅在未连接到网络时返回-1;
答案 8 :(得分:2)
尝试这种方法。
public boolean isInternetConnected() {
ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
boolean ret = true;
if (conMgr != null) {
NetworkInfo i = conMgr.getActiveNetworkInfo();
if (i != null) {
if (!i.isConnected()) {
ret = false;
}
if (!i.isAvailable()) {
ret = false;
}
}
if (i == null)
ret = false;
} else
ret = false;
return ret;
}
此方法有助于查找是否可用的互联网连接。
答案 9 :(得分:2)
这对我有用:
ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// Mobile
State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
// Wi-Fi
State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
// And then use it like this:
if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING)
{
Toast.makeText(Wifi_Gprs.this,"Mobile is Enabled :) ....",Toast.LENGTH_LONG).show();
}
else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING)
{
Toast.makeText(Wifi_Gprs.this,"Wifi is Enabled :) ....",Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(Wifi_Gprs.this,"No Wifi or Gprs Enabled :( ....",Toast.LENGTH_LONG).show();
}
并添加此权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
答案 10 :(得分:2)
许多答案都使用了不赞成使用的代码,或者在higer API版本上可用的代码。现在我用这样的东西
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivityManager != null) {
for (Network net : connectivityManager.getAllNetworks()) {
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(net);
if (nc != null && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
&& nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET))
return true;
}
}
return false;
答案 11 :(得分:2)
以下代码(在Kotlin中)从API 21开始运行,直到至少是当前的API版本(API 29)。 函数getWifiState()返回WiFi网络状态的3个可能值之一: 枚举类中定义的“禁用”,“ EnabledNotConnected”和“已连接”。 这样可以做出更精细的决定,例如通知用户启用WiFi或(如果已启用)连接到可用网络之一。 但是,如果只需要一个布尔值即可指示WiFi接口是否已连接到网络,则另一个函数isWifiConnected()会为您提供。它使用上一个,并将结果与“已连接”进行比较。
它的灵感来自先前的一些答案,但它试图解决由于Android API的演进或IP V6可用性的缓慢增长而引入的问题。 诀窍是使用:
wifiManager.connectionInfo.bssid != null
代替:
根据文档:https://developer.android.com/reference/kotlin/android/net/wifi/WifiInfo.html#getbssid 如果未连接到网络,它将返回null。即使我们没有获得真实值的权限,但如果我们已连接,它将仍然返回null以外的值。
还要注意以下几点:
在此对象android.os.Build.VERSION_CODES#N之前的版本上 只能从Context#getApplicationContext()获得,并且 并非来自任何其他派生上下文,以避免内存泄漏 调用过程。
在清单中,不要忘记添加:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
建议的代码是:
class MyViewModel(application: Application) : AndroidViewModel(application) {
// Get application context
private val myAppContext: Context = getApplication<Application>().applicationContext
// Define the different possible states for the WiFi Connection
internal enum class WifiState {
Disabled, // WiFi is not enabled
EnabledNotConnected, // WiFi is enabled but we are not connected to any WiFi network
Connected, // Connected to a WiFi network
}
// Get the current state of the WiFi network
private fun getWifiState() : WifiState {
val wifiManager : WifiManager = myAppContext.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
return if (wifiManager.isWifiEnabled) {
if (wifiManager.connectionInfo.bssid != null)
WifiState.Connected
else
WifiState.EnabledNotConnected
} else {
WifiState.Disabled
}
}
// Returns true if we are connected to a WiFi network
private fun isWiFiConnected() : Boolean {
return (getWifiState() == WifiState.Connected)
}
}
答案 12 :(得分:1)
以下是我在我的应用中用作实用工具的方法:
public static boolean isDeviceOnWifi(final Context context) {
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return mWifi != null && mWifi.isConnectedOrConnecting();
}
答案 13 :(得分:1)
在新版Android中
private void getWifiInfo(Context context) {
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] networks = connManager.getAllNetworks();
if(networks == null || networks.length == 0)
return;
for( int i = 0; i < networks.length; i++) {
Network ntk = networks[i];
NetworkInfo ntkInfo = connManager.getNetworkInfo(ntk);
if (ntkInfo.getType() == ConnectivityManager.TYPE_WIFI && ntkInfo.isConnected() ) {
final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
if (connectionInfo != null) {
// add some code here
}
}
}
}
并添加预设
答案 14 :(得分:1)
类似于@Jason Knight的回答,但以科特林的方式:
List = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
答案 15 :(得分:0)
这适用于最新版本的安卓:
SELECT CAST('test' AS varchar(10)) FROM < external table to database C >
在清单中:
fun getConnectionType(context: Context): ConnectivityType {
var result = NONE
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (cm != null) {
val capabilities = cm.getNetworkCapabilities(cm.activeNetwork)
if (capabilities != null) {
when {
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
result = WIFI
}
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
result = MOBILE_DATA
}
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> {
result = VPN
}
}
}
}
} else {
if (cm != null) {
val activeNetwork = cm.activeNetworkInfo
if (activeNetwork != null) {
// connected to the internet
when (activeNetwork.type) {
ConnectivityManager.TYPE_WIFI -> {
result = WIFI
}
ConnectivityManager.TYPE_MOBILE -> {
result = MOBILE_DATA
}
ConnectivityManager.TYPE_VPN -> {
result = VPN
}
}
}
}
}
return result
}
enum class ConnectivityType {
NONE,
MOBILE_DATA,
WIFI,
VPN,
}
答案 16 :(得分:0)
总结较新的android版本中的其他答案:
private boolean checkWifiOnAndConnected()
{
ConnectivityManager connMgr =
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = connMgr.getActiveNetwork();
if (network != null)
{
NetworkCapabilities networkCapabilities = connMgr.getNetworkCapabilities(network);
return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
return false;
}
答案 17 :(得分:0)
val wifi = context!!.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
if (wifi!!.isWifiEnabled)
//do action here
else
//do action here
答案 18 :(得分:0)
有点老问题了,但这就是我用的。要求最低api级别21还考虑了不建议使用的Networkinfo api。
boolean isWifiConn = false;
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Network network = connMgr.getActiveNetwork();
if (network == null) return false;
NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
if(capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)){
isWifiConn = true;
Toast.makeText(context,"Wifi connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context,"Wifi not connected Api >= "+Build.VERSION_CODES.M,Toast.LENGTH_LONG).show();
}
} else {
for (Network network : connMgr.getAllNetworks()) {
NetworkInfo networkInfo = connMgr.getNetworkInfo(network);
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
isWifiConn = true;
Toast.makeText(context,"Wifi connected ",Toast.LENGTH_LONG).show();
break;
}else{
Toast.makeText(context,"Wifi not connected ",Toast.LENGTH_LONG).show();
}
}
}
return isWifiConn;
答案 19 :(得分:0)
为此添加JAVA:
public boolean CheckWifiConnection() {
ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE);
if (conMgr.getActiveNetworkInfo() != null
&& conMgr.getActiveNetworkInfo().isAvailable()
&& conMgr.getActiveNetworkInfo().isConnected()) {
return true;
} else {
return false;
}
}
在清单文件中添加以下权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
答案 20 :(得分:0)
从NetworkInfo
和ConnectivityManager#getNetworkInfo()
开始,从API级别29开始不推荐使用ConnectivityManager#getActiveNetworkInfo()
类。
documentation现在建议人们使用ConnectivityManager.NetworkCallback
API进行异步回调监视,或者使用ConnectivityManager#getNetworkCapabilities
或ConnectivityManager#getLinkProperties
来同步访问网络信息
呼叫者应改用ConnectivityManager.NetworkCallback API来了解连接性更改,或切换为使用ConnectivityManager#getNetworkCapabilities或ConnectivityManager#getLinkProperties同步获取信息。
要检查WiFi是否已连接,这是我使用的代码:
科特琳:
val connMgr = applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
connMgr?: return false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val network: Network = connMgr.activeNetwork ?: return false
val capabilities = connMgr.getNetworkCapabilities(network)
return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
val networkInfo = connMgr.activeNetworkInfo ?: return false
return networkInfo.isConnected && networkInfo.type == ConnectivityManager.TYPE_WIFI
}
Java:
ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr == null) {
return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Network network = connMgr.getActiveNetwork();
if (network == null) return false;
NetworkCapabilities capabilities = connMgr.getNetworkCapabilities(network);
return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
} else {
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return networkInfo.isConnected() && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
请记住还要向清单文件中添加权限ACCESS_NETWORK_STATE
。
答案 21 :(得分:0)
如果未启用WIFI,则可以打开WIFI,如下所示 1.检查WIFI状态,由@Jason Knight回答 2.如果未激活,请将其激活 不要忘记在清单文件中添加WIFI权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
你的Java类应该是那样的
public class TestApp extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//check WIFI activation
ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWifi.isConnected() == false) {
showWIFIDisabledAlertToUser();
}
else {
Toast.makeText(this, "WIFI is Enabled in your devide", Toast.LENGTH_SHORT).show();
}
}
private void showWIFIDisabledAlertToUser(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("WIFI is disabled in your device. Would you like to enable it?")
.setCancelable(false)
.setPositiveButton("Goto Settings Page To Enable WIFI",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
Intent callGPSSettingIntent = new Intent(
Settings.ACTION_WIFI_SETTINGS);
startActivity(callGPSSettingIntent);
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int id){
dialog.cancel();
}
});
AlertDialog alert = alertDialogBuilder.create();
alert.show();
}
}
答案 22 :(得分:0)
尝试
wifiManager.getConnectionInfo().getIpAddress()
这将返回0,直到设备具有可用连接(在我的机器上,Samsung SM-T280,Android 5.1.1)。
答案 23 :(得分:0)
这是一个更简单的解决方案。请参阅堆栈溢出 问题 Checking Wi-Fi enabled or not on Android 。
P.S。不要忘记将代码添加到manifest.xml文件以允许权限。如下图所示。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>