- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道有一种方法可以通过检查类似 "http://clients3.google.com/generate_204"
的响应来确定 WiFi 网络是否为强制门户。
但我的问题有些不同。我们都知道,在 Android 上,当我们连接到 WiFi 网络时,连接周期会经历类 NetworkInfo.DetailedState 中提到的许多状态。 , 像 AUTHENTICATING
, OBTAINING_IPADDR
, VERIFYING_POOR_LINK
等。另外,其中一个状态是 CAPTIVE_PORTAL_CHECK
和 android 系统检查是否正在连接的网络是否被俘虏。为此 Android 使用 CaptivePortalTracker#isCaptivePortal(InetAddress server)结果是 boolean
。所以我们确定 Android 知道连接是否受限(强制)
所以,我的问题是,Android 系统是否会提供一些回调或某种状态,让我们无需手动检查即可知道网络是强制门户?由于 Android 系统已经检查了网络强制门户,我们需要再次做同样的事情吗?
附言我只针对 API 19 (KitKat 4.4.2)。
最佳答案
您可以从网络获取网络能力并检查它是否具有 NET_CAPABILITY_CAPTIVE_PORTAL
:
API 23
ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
Network activeNetwork=connectivityManager.getActiveNetwork();
NetworkCapabilities networkCapabilities=connectivityManager.getNetworkCapabilities(activeNetwork);
if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)){
//DO SOMETHING
}
http://developer.android.com/intl/es/reference/android/net/NetworkCapabilities.html
NetworkCapabilities 是在 API 21 中引入的,所以你可以这样做
API >= 21
ConnectivityManager connectivityManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] activeNetworks=connectivityManager.getAllNetworks();
for(Network network:activeNetworks){
if(connectivityManager.getNetworkInfo(network).isConnected()){
NetworkCapabilities networkCapabilities=connectivityManager.getNetworkCapabilities(network);
if(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL)){
//DO SOMETHING
}
break;
}
}
关于android - 如何知道连接的 WiFi 是 Walled Gardened (Captive Portal)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34576138/
-o 更改输出文件名(我发现使用--help) 但我不知道 -Wall 是做什么的? 最佳答案 它是“warn all”的缩写——它打开(几乎)所有 g++ 可以告诉你的警告。通常是个好主意,尤其是如
我的墙脚本存在问题,单个帖子在用户自己的墙上显示多次,在他的 friend 墙上显示一次。例如,如果我有 5 个 friend ,脚本将显示单个帖子 5 次。 由于它在 friend 墙上显示过一次,
我有一个基本程序,您可以在其中使用箭头键绕圆圈移动。我正在努力使球(蓝色矩形)无法进入某个区域,但它不起作用。我正在使用 Eclipse。 package TLOT; import java.awt.
我正试图在我的网站上展示我的墙上最近的一些帖子。当搜索遍了我得到的结果张贴到墙上的网站。 我查看了Facebook开发人员的网站,在那里我无法得到明确的想法。 请专家帮忙。 编辑1: Likebox插
我正在使用 GCC 4.8 用 C 编写一个项目,我想查看所有警告(希望消除它们),但问题是我 #include 一些旧的、未维护的库,这给了我巨大的警告墙以应对 -墙选项。我没有办法解决这些问题,我
在 GCC 中编译时是否可以包含 -Wall 标志,但随后从该子集中排除单个标志,例如 -Wattributes?或者,可以包括除 -Wattributes 之外的所有警告标志,但我认为必须有一种更简
好吧,我知道这个问题已经在很多地方被问过很多次了,但我还无法解决这个问题。我尝试了 java.util.Date 以及 JodaTime API。 我的问题是如何考虑应用程序运行所在的时区返回当前日期
我在这里使用jquery插件Facebook Wall jquery plugin我想在 jquery Facebox 中显示帖子墙。由于某种原因,如果 fb.wall 不是从 Facebox 中加载
我的函数不断出错,我检查了其他答案以寻求帮助,但找不到任何答案。 #include double celsius_at_depth(double celtemp); double fahre
目前我正在使用此命令在 Mint 中编译我的 .c 文件 gcc -std=gnu99 -Wall -Werror filename.c -o filename [-lm] 如何将这些参数设为默认值,
我想在 Facebook 墙上发布一些文字。 我看过“Facebook 开发人员”的教程,但他们建议使用一个按钮登录,另一个按钮发布提要。不幸的是,这不是我想要的。 我想要的是单击我制作的按钮并直接在
所以我想让用户通过粘贴或使用 wall 自己键入来输入特定消息,然后使用 wall 将其广播给所有用户。我的想法是,我不想只有一行消息,而是允许在不使用文本文件的情况下提供他们想要的尽可能大的消息。
我正在编写一个模块来计算给定日期的半小时交易时段。交易时段从半小时开始,从 1(00:00 开始)到 48(23:30 开始)连续编号。通常一天有 48 个交易时段,但在夏令时开始的那一天有 46 个
我在一个编码类(class)中,我们通过命令行参数用 C++ 进行编码,但她正在使用某些我无法通过谷歌搜索找到的东西,但我在本网站的其他帖子中看到过这些东西。我的虚拟机是 Linux。 -Wall 在
假设我有: class Vector3 { float x, y, z; ... bunch of cuntions .. static operator+(const Vector3&,
我正在尝试在 Keil IDE 中为 stm32f103 微 Controller 使用 gcc 编译器。我正在编译一个相对较小的项目,其中包含一些模板代码和几个纯虚拟类。没有花哨的 C++11 东西
我想知道如何使用 spritekit 创建一堵墙。物体上的东西不能移动过去。我知道我可以使用这段代码: self.physicsBody = [SKPhysicsBody bodyWithEdgeLo
我最近开始使用 -Wall 编译器开关来尝试提高我的代码质量。它(正确地)给出了关于这个小片段的警告...... int i; for (i = start - 1; i >= 0;
我有一个有缺陷的程序示例,它应该给出一个关于未初始化变量的警告,但是当我编译它时 gcc 没有给我任何警告。 代码如下: #include int main() { int foo;
这是源文件 get.c 的内容: #include int main(){ //int i = 0; char b[10]; gets(b); puts(b); return 0
我是一名优秀的程序员,十分优秀!