gpt4 book ai didi

android - 以编程方式连接到 Android Q 中的 Wifi

转载 作者:行者123 更新时间:2023-12-03 13:25:33 27 4
gpt4 key购买 nike

我有这个功能可以连接到 Wifi 网络,在 Android 10 以下它工作正常,但是当我在 Android 10 上尝试时,我连接成功,但 没有互联网 ,我知道是a bug in Android 10但我发现了这个 application它可以毫无问题地从 Android 10 连接到 wifi。
我被屏蔽了好几天。
我的功能:

private void connectToWifi(String ssid, String password)
{
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
try {
Log.e(TAG,"connection wifi pre Q");
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "\"" + ssid + "\"";
wifiConfig.preSharedKey = "\"" + password + "\"";
int netId = wifiManager.addNetwork(wifiConfig);
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();

} catch ( Exception e) {
e.printStackTrace();
}
} else {
Log.e(TAG,"connection wifi Q");

WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
.setSsid( ssid )
.setWpa2Passphrase(password)
.build();

NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifier)
.build();

connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);


networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);

connectivityManager.bindProcessToNetwork(network);
Log.e(TAG,"onAvailable");
}

@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Log.e(TAG,"onLosing");
}

@Override
public void onLost(Network network) {
super.onLost(network);
Log.e(TAG, "losing active connection");
}

@Override
public void onUnavailable() {
super.onUnavailable();
Log.e(TAG,"onUnavailable");
}
};
connectivityManager.requestNetwork(networkRequest,networkCallback);


}
}

最佳答案

到目前为止,在我测试过的大多数设备上,什么对我有用,有一个回退选项,至少可以停止可怕的“循环请求”并允许成功的手动连接
下面的代码是用 Kotlin 编写的,如果需要,请谷歌如何转换到 Java。
创建 API >= 29 所需的 NetworkCallback(之前不需要但可以使用)

val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// To make sure that requests don't go over mobile data
connectivityManager.bindProcessToNetwork(network)
} else {
connectivityManager.setProcessDefaultNetwork(network)
}
}

override fun onLost(network: Network) {
super.onLost(network)
// This is to stop the looping request for OnePlus & Xiaomi models
connectivityManager.bindProcessToNetwork(null)
connectivityManager.unregisterNetworkCallback(networkCallback)
// Here you can have a fallback option to show a 'Please connect manually' page with an Intent to the Wifi settings
}
}
连接到网络如下:
val wifiNetworkSpecifier = WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(pass)
.build()

val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
// Add the below 2 lines if the network should have internet capabilities.
// Adding/removing other capabilities has made no known difference so far
// .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
// .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.setNetworkSpecifier(wifiNetworkSpecifier)
.build()

connectivityManager.requestNetwork(networkRequest, networkCallback)
如前所述 here by Google , 一些 OEM Roms 没有“坚持请求”,因此连接立即断开。 OnePlus 在其后期的一些型号中解决了这个问题,但不是全部。对于某些 Android 版本上的某些手机型号,此错误将持续存在,因此需要成功回退(即没有网络中断的手动连接)。没有已知的解决方法可用,但如果找到,我会在这里更新它作为一个选项。
要删除网络,请执行以下操作:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//This is required for Xiaomi models for disconnecting
connectivityManager.bindProcessToNetwork(null)
} else {
connectivityManager.setProcessDefaultNetwork(null)
}
connectivityManager.unregisterNetworkCallback(it)
请记住,自动连接允许自动和手动断开连接。手动连接(例如建议的 OnePlus 设备后备)不允许自动断开连接。当涉及到物联网设备时,这也需要在应用程序中处理以获得更好的用户体验设计。
一些额外的小提示和信息:
  • 现在系统对话框打开,应用程序分别调用 onPause 和 onResume。这影响了我关于自动连接到物联网设备的逻辑。在某些情况下,onResume 在网络回调完成之前被调用。
  • 关于测试,我还不能仅使用 espresso 来绕过对话框,它可能会阻止一些在 API 29 之前工作的测试。使用其他框架(例如 uiautomator)可能是可能的。在我的情况下,我调整了测试,直到对话框显示,然后运行进一步的测试。
    使用 Intents.init() 不起作用。
  • 当找到网络时调用 onUnavailable,但用户取消。当未找到网络或用户在找到网络之前取消对话时不会调用它,在这种情况下没有调用其他方法,请使用 onResume 来捕获它。
  • 当它在 OnePlus 上失败时,它分别调用 onAvailable() -> onCapabilitiesChanged() -> onBlockedStatusChanged (blocked: false) -> onCapabilitiesChanged() -> onLost()
  • removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 不会帮助保持 OnePlus 上的连接,如所述 here
  • 如上所述,设置 Bssid 不会帮助保持 OnePlus 上的连接here
  • 谷歌无法提供帮助,他们已经声明这是他们无法控制的here
  • OnePlus 论坛帖子确认更新后它适用于某些型号(但不是全部),请参阅 here , here & here
  • GPS关闭时,网络的SSID名称不可用
  • 如果对话框多次出现,请检查您自己的 Activity 生命周期,在我的情况下,某些模型在收到网络回调之前调用了 onResume。
  • 手动连接到没有互联网功能的网络需要用户确认以保持连接(有时以对话或通知的形式),如果忽略,系统将在不久之后断开网络连接

  • 测试设备列表:
  • Google Pixel 2 - 未发现任何问题
  • 三星 S10 SM-G970F - 未发现问题
  • 三星 S9 SM-G960F - 未发现任何问题
  • 一加 A5000 (OxegenOS 10.0.1) - 自动连接的主要问题
  • HTC One M8 (LineageOS 17.1) - 未发现问题
  • 小米米 Note 10 - 断开连接问题(已修复,请参阅代码示例)
  • 三星 A50 - 连接成功后重复出现对话框(有时)
  • 华为 Mate Pro 20 - 连接成功后重复出现对话框(有时)
  • 华为 P40 Lite - 不调用 onLost()
  • CAT S62 Pro - 未发现问题
  • Sony Xperia SZ2 - 未发现任何问题
  • 三星 Note10 - 未发现问题
  • 关于android - 以编程方式连接到 Android Q 中的 Wifi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63124728/

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