gpt4 book ai didi

android - 如何使用 NetworkRequest.Builder().setNetworkSpecifier(string) 指定 wifi 网络

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:27:44 24 4
gpt4 key购买 nike

出于安全原因,我正在寻找一种方法让 Android 5.0 平板电脑连接到没有互联网连接的内部网。

问题是谷歌自 4.4/5.0 起在 android 中构建的强制门户保护。调用 android connectivitycheck检查互联网连接,当此调用失败时,wifi 网络被标记为不工作并避免。很蹩脚。

其他人也遇到了同样的问题,有些人建议使用 android 5 中引入的新 API,请参阅: Android 5.0 Lollipop and 4.4 KitKat ignores my WiFi network, enableNetwork() is useless

这方面的文档非常模糊:

NetworkRequest.Builder.setNetworkSpecifier(String  networkSpecifier)

“这个字符串的解释是承载特定的,使用它的承载应该记录他们的细节。例如,蓝牙可能使用某种设备 ID,而 WiFi 可以使用 ssid 和/或 bssid。蜂窝可能使用运营商spn”

我试过了,还是不行。主要问题是一旦我使用 setNetworkSpecifier() 就找不到网络。我尝试使用 AP 的 bssid (mac) 和 ssid

看起来过滤器正在工作,但不清楚它应该如何工作。如果我遗漏了 setNetworkSpecifier() 调用,则会找到 1 个网络,但无法确定是哪个网络。至少它表明我的代码有效。

那么如果ssid和bssid不行的话,我应该在这填什么呢?

这是我的代码。

 private void connect(String ssid, Context context) {
Log.i(TAG, "try connect to! " + ssid);
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).
removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED).
removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET

setNetworkSpecifier(ssid). //<--- here is the problem
build();
ConnectivityManager.NetworkCallback callback
= new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName());
}
}

@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps());
}
} catch (Exception e) {
e.printStackTrace();
}
}

@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
Log.i(TAG, "requestNetwork ");
// cm.requestNetwork(nr, callback);
cm.registerNetworkCallback(nr, callback);
}
}

最佳答案

我在 Android Studio 中调试了在三星 S5 (SM-G900V)、API 23 (6.0.1) 上运行的以下代码。

void inspectNetworks() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Network[] ns = connectivity.getAllNetworks();
for (Network n : ns) {
NetworkCapabilities c = connectivity.getNetworkCapabilities(n);
Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint
}
}
}

我发现 Wi-Fi 网络根本没有任何 networkSpecifier:

in Android Studio Debug view, mNetworkSpecifier = null

也许 WIFInetworkSpecifier 将在未来实现 - 传输网络......为了记录,我发现 networkSpecifier < em>被设置为 1 在这个特定的手机上,对于两个现有的 CELLULAR - 传输网络。

就目前而言,调用 addCapability 似乎尽可能具体是请求 Wi-Fi 网络时的最佳选择。

关于android - 如何使用 NetworkRequest.Builder().setNetworkSpecifier(string) 指定 wifi 网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34433710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com