ConnectivityManager网络回调无法在没有Internet连接的情况下捕获与wifi网络的连接

时间:2018-07-31 13:28:44

标签: android android-connectivitymanager

我有一台可以通过WIFI连接到我的应用的设备,但是该设备没有互联网。我实现了NetworkCallback来捕捉连接方面的变化,例如:

[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes(@'
$secpasswd = ConvertTo-SecureString "password" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("domain\username", $secpasswd)
Enter-PSSession -ComputerName Some-Host-Name -port 5985 -Credential $mycreds
sc.exe config "MyNewService" obj="user@domain.local" password= "password"
'@))

当我的Wifi和移动数据都打开并且我在具有Internet访问权限的不同wifi网络之间切换时,“ onAvailable()” 会触发并打印以记录我通过wifi连接的日志。 当我尝试连接到没有互联网的wifi网络时,“ onAvailable()” 方法将触发并打印通过移动设备连接的wifi,并且该设备在wifi图标旁边显示一个感叹号

有没有办法我仍然可以接上没有互联网的wifi网络?

3 个答案:

答案 0 :(得分:0)

创建实用程序

public class CheckInternet extends AsyncTask<Void,Void,Boolean> {

private Consumer mConsumer;
public  interface Consumer { void accept(Boolean internet); }

public  CheckInternet(Consumer consumer) { mConsumer = consumer; execute(); }

@Override protected Boolean doInBackground(Void... voids) { try {
    Socket sock = new Socket();
    sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
    sock.close();
    return true;
} catch (IOException e) { return false; } }

@Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); }

}

使用此方法检查Internet连接

 new InternetCheck(internet -> {
    if (internet){
        check your condition
    }else {
        //error message
    }

答案 1 :(得分:0)

您必须使用Connectivity Manager注册网络回叫。

ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkRequestBuilder.Builder builder = new NetworkRequest.Builder()
//Use builder to set custom network parameter
connMgr.requestNetwork(builder.build(),new ConnectivityNetworkCallback())

答案 2 :(得分:0)

我一直在努力解决同一问题。现在看来对我有用的是首先获得网络功能:

connectivityManager.getNetworkCapabilities(network)

然后检查连接是否可以连接互联网并经过验证:

private val NetworkCapabilities.hasInternet
    get() = hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
        else -> true
    }

不幸的是,NetworkCapabilities.NET_CAPABILITY_VALIDATED标志仅在API 23中引入,这就是为什么在这种情况下我忽略该标志的原因。