F_hawk189
F_hawk189
  • 发布:2019-04-17 12:09
  • 更新:2024-02-05 17:57
  • 阅读:4119

Android9之后wifi主动连接失败

分类:uni-app

Android9开始,WIFI那块的API发生了改变:
addNetwork(WifiConfiguration config)
此方法在API级别Q中已弃用.a)请参阅WifiNetworkSpecifier.Builder#build()触发与Wi-Fi网络连接的新机制。b)见addNetworkSuggestions(java.util.List), removeNetworkSuggestions(java.util.List)新的API添加Wi-Fi网络进行审议时,自动连接到无线网络。 兼容性注意:对于目标Build.VERSION_CODES.Q或更高的应用程序 ,此API将始终返回-1。

enableNetwork(int netId, boolean attemptConnect)  

此方法在API级别Q中已弃用.a)请参阅WifiNetworkSpecifier.Builder#build()触发与Wi-Fi网络连接的新机制。b)见addNetworkSuggestions(java.util.List), removeNetworkSuggestions(java.util.List)新的API添加Wi-Fi网络进行审议时,自动连接到无线网络。 兼容性注意:对于目标Build.VERSION_CODES.Q或更高的应用程序 ,此API将始终返回false。

上边是安卓官方文档翻译后的。
API更新之后就导致了之前那种连接WIFI的方法没法使用了,addNetwork和enableNetwork一直返回-1和false。
但是新版API用法不会用,在uni-app中不会使用。截图在后面。
所以现在高版本安卓系统中
http://ask.dcloud.net.cn/question/7944
这种方法失效了。
跪求各位大佬,谁有解决方案

2019-04-17 12:09 负责人:无 分享
已邀请:
dangweiwu

dangweiwu

同问 有解决方案了没

  • Allan_Zhang

    可以规避,compileSdkVersion使用28,不用Android9

    2020-10-13 16:20

夕心o

夕心o

同问 问题解决了没有 我也遇到了wifi 链接问题

  • DaTian

    我也遇到了,有解决方案嘛

    2022-12-03 15:47

1***@qq.com

1***@qq.com

以下是网络建议连接方式,希望有帮助:
const MainActivity = plus.android.runtimeMainActivity()
const wifiManager = MainActivity.getSystemService(Context.WIFI_SERVICE)
const ssid = wifi.SSID; // 要连接的 WiFi 的 SSID
const password = wifi.pwd; // WiFi 的密码
const Build = plus.android.importClass('android.os.Build');
const WifiNetworkSuggestion = plus.android.importClass('android.net.wifi.WifiNetworkSuggestion');
const ArrayList = plus.android.importClass('java.util.ArrayList');

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
const wifiNetworkSuggestion = new WifiNetworkSuggestion.Builder()
.setPriority(1)
.setSsid(ssid)
.setWpa2Passphrase(password)
.build();
const WifiNetworkSuggestionList = wifiManager.getNetworkSuggestions();
wifiManager.removeNetworkSuggestions(WifiNetworkSuggestionList);
const arrayList = new ArrayList();
arrayList.add(wifiNetworkSuggestion);
wifiManager.addNetworkSuggestions(arrayList);
}

还有一种方式是给当前app连接一个独享的wifi连接,代码如下(uts文件代码):
import Context from 'android.content.Context';
import WifiNetworkSpecifier from 'android.net.wifi.WifiNetworkSpecifier';
import NetworkRequest from 'android.net.NetworkRequest';
import NetworkCapabilities from 'android.net.NetworkCapabilities';
import ConnectivityManager from "android.net.ConnectivityManager";
import Network from "android.net.Network"
import NetworkCallback from "android.net.ConnectivityManager.NetworkCallback";
import MacAddress from "android.net.MacAddress"

/ 引入 interface.uts 文件中定义的变量 /
import { MyApiOptions, MyApiResult, MyApi, MyApiSync } from '../interface.uts';

/ 引入 unierror.uts 文件中定义的变量 /
import { MyApiFailImpl } from '../unierror';

export function connectWifi2(bssid : string, ssid : string, password : string) {
const connectivityManager = UTSAndroid.getAppContext()!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager;

const wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()  
    .setBssid(MacAddress.fromString(bssid))  
    .setSsid(ssid)  
    .setWpa2Passphrase(password)  
    .build();  

//网络请求  
const request = new NetworkRequest.Builder()  
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)  
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)  
    .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)  
    .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)  
    .setNetworkSpecifier(wifiNetworkSpecifier)  
    .build();  

//网络回调处理  
const networkCallback = new MyNetworkCallback();  

//请求连接网络  
connectivityManager.requestNetwork(request, networkCallback);  

}

class MyNetworkCallback extends NetworkCallback {

constructor() {  
    super();  
}  

override onAvailable(network : Network) : void {  
    super.onAvailable(network);  
    console.log("======onAvailable: ====连接成功======");  
}  

override onUnavailable() : void {  
    super.onUnavailable();  
    console.log("======onAvailable: ====连接失败======");  
}  

}

要回复问题请先登录注册