通过编程方式连接到Android Q中的Wifi
我有这个功能可以在Wifi网络中连接,在Android 10下可以正常工作,但是当我在Android 10上尝试时,我成功连接了,但是没有互联网,,我知道是的,但我发现这个功能可以从Android 10连接到Wifi,没有问题。 我被封锁了好几天 我的职能:通过编程方式连接到Android Q中的Wifi,android,wifi,android-wifi,android-10.0,Android,Wifi,Android Wifi,Android 10.0,我有这个功能可以在Wifi网络中连接,在Android 10下可以正常工作,但是当我在Android 10上尝试时,我成功连接了,但是没有互联网,,我知道是的,但我发现这个功能可以从Android 10连接到Wifi,没有问题。 我被封锁了好几天 我的职能: private void connectToWifi(String ssid, String password) { WifiManager wifiManager = (WifiManager) getSystem
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);
}
}
private void connectToWifi(字符串ssid,字符串密码)
{
WifiManager WifiManager=(WifiManager)getSystemService(WIFI_服务);
if(Build.VERSION.SDK_INT
如果你想通过互联网连接到WiFi,你应该使用这种网络请求:
此外,您需要为您的进程指定默认路由,以便永久向已连接的WiFi AP发出请求。只需将下一个方法的调用添加到OnAvailable下的NetworkCallback,如下所示:
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
createNetworkRoute(network, connectivityManager);
}
};
if (connectivityManager!= null) connectivityManager.requestNetwork(request, networkCallback);
不要忘记断开与绑定网络的连接:
connectivityManager.unregisterNetworkCallback(networkCallback);
最后,您可以在不同的库中找到最佳实践,如。如果您具有root访问权限(adb root):
adb推送\WifiConfigStore.xml/data/misc/wifi/
adb push\WifiConfigStore.xml.encrypted-checksum/data/misc/wifi/
亚洲开发银行重启
您可以尝试api,我可以使用它们进行连接
final WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion.Builder()
.setSsid("YOUR_SSID")
.setWpa2Passphrase("YOUR_PRE_SHARED_KEY")
.build();
final List<WifiNetworkSuggestion> suggestionsList =
new ArrayList<WifiNetworkSuggestion>();
suggestionsList.add(suggestion1);
WifiManager wifiManager =
(WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status == 0 ){
Toast.makeText(this,"PSK network added",Toast.LENGTH_LONG).show();
Log.i(TAG, "PSK network added: "+status);
}else {
Toast.makeText(this,"PSK network not added",Toast.LENGTH_LONG).show();
Log.i(TAG, "PSK network not added: "+status);
}
最终wifinetworks建议1=
新的WifiNetworkSuggestion.Builder()
.setSsid(“您的_SSID”)
.setWpa2Passphrase(“您的共享密钥”)
.build();
最终列表建议列表=
新的ArrayList();
建议列表。添加(建议1);
wifi经理wifi经理=
(WifiManager)getApplicationContext().getSystemService(Context.WIFI_服务);
int status=wifiManager.addNetworkSuggestions(建议列表);
如果(状态==0){
Toast.makeText(这是“添加了PSK网络”,Toast.LENGTH_LONG.show();
Log.i(标签,“添加PSK网络:”+状态);
}否则{
Toast.makeText(这是“未添加PSK网络”,Toast.LENGTH_LONG.show();
Log.i(标签,“未添加PSK网络:”+状态);
}
因此,我的解决方案是使用targetSdkVersion 28编译你的应用程序。
要连接到wifi,请使用此功能
connectToWifi(String ssid, String key)
目前这只是一个解决办法,等待谷歌发布此漏洞的修复程序,有关更多信息,请参阅向谷歌报告的问题:
}到目前为止,在我测试过的大多数设备上,什么对我有效,有一个回退选项,至少可以停止可怕的“循环请求”,并允许成功的手动连接 下面的代码是用Kotlin编写的,如果需要,请用谷歌搜索如何转换为Java 创建API>=29所需的NetworkCallback(以前不需要,但可以使用) 按如下方式连接到网络:
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)
如上所述,一些OEM ROM没有“保留请求”,因此连接会立即中断。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)
请记住,自动连接允许自动和手动断开连接
adb push <location>\WifiConfigStore.xml /data/misc/wifi/
adb push <location>\WifiConfigStore.xml.encrypted-checksum /data/misc/wifi/
adb reboot
final WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion.Builder()
.setSsid("YOUR_SSID")
.setWpa2Passphrase("YOUR_PRE_SHARED_KEY")
.build();
final List<WifiNetworkSuggestion> suggestionsList =
new ArrayList<WifiNetworkSuggestion>();
suggestionsList.add(suggestion1);
WifiManager wifiManager =
(WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status == 0 ){
Toast.makeText(this,"PSK network added",Toast.LENGTH_LONG).show();
Log.i(TAG, "PSK network added: "+status);
}else {
Toast.makeText(this,"PSK network not added",Toast.LENGTH_LONG).show();
Log.i(TAG, "PSK network not added: "+status);
}
connectToWifi(String ssid, String key)
public void connectToWifi(String ssid, String key) {
Log.e(TAG, "connection wifi pre Q");
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "\"" + ssid + "\"";
wifiConfig.preSharedKey = "\"" + key + "\"";
int netId = wifiManager.addNetwork(wifiConfig);
if (netId == -1) netId = getExistingNetworkId(wifiConfig.SSID);
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
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)
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)
private ConnectivityManager mConnectivityManager;
@Override
public void onCreate(@Nullable Bundle savedInstanceState){
// instantiate the connectivity manager
mConnectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
}
public void connect(String ssid, String password) {
NetworkSpecifier networkSpecifier = new WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(password)
.setIsHiddenSsid(true) //specify if the network does not broadcast itself and OS must perform a forced scan in order to connect
.build();
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(networkSpecifier)
.build();
mConnectivityManager.requestNetwork(networkRequest, mNetworkCallback);
}
public void disconnectFromNetwork(){
//Unregistering network callback instance supplied to requestNetwork call disconnects phone from the connected network
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
}
private ConnectivityManager.NetworkCallback mNetworkCallback = new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
//phone is connected to wifi network
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
//phone is about to lose connection to network
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
//phone lost connection to network
}
@Override
public void onUnavailable() {
super.onUnavailable();
//user cancelled wifi connection
}
};
startActivity(new Intent("android.settings.panel.action.INTERNET_CONNECTIVITY"))