gpt4 book ai didi

java - 当指定仅使用 wifi 时,ConnectivityManager Network 为 null

转载 作者:行者123 更新时间:2023-12-01 23:54:55 24 4
gpt4 key购买 nike

我正在尝试通过 ConnectivityManager 存储 wifi 网络(最终是蜂窝网络),以便稍后在我的程序中使用,以同时通过本地 Wifi 或蜂窝网络发送数据。我已经按照这篇文章( Make Android simultaneously use WiFi to talk to a device and mobile data to talk to a server?How to stay connected through mobile network after WIFI is connected on Android? )尝试让它运行。然而,mWifiNetwork 为空。使用 Debug模式,变量 mWifiNetwork 显示为 "108",然后当 '''onAvailable''' 方法完成时,变量返回为 null。不确定为什么变量没有正确存储网络。

我创建了一个在 onResume 中调用的 ForceWifiNetwork 类

forceWifiNetwork.java

public class forceWifiNetwork {

//setting up a context variable and method to use "getSystemService"
// this way we do not need to extend MainActivity class to this class
// But when we initialize this class in main activity we will have to pass in "this" to the class as a parameter

Context mContext;
private ConnectivityManager.NetworkCallback mWifiNetworkCallback;
public Network mWifiNetwork;
final ConnectivityManager manager;



public forceWifiNetwork(Context mContext){
this.mContext = mContext;
manager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
}




public void cellConnect(){

if (mWifiNetworkCallback == null){

// Init only once
mWifiNetworkCallback = new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(final Network network){
try{
//Save this network for later use
mWifiNetwork = network;
}catch(Exception e){
Log.i("onAvailable ERROR","Error in onAvailable method");
}
}
};
}

NetworkRequest.Builder wifiBuilder;
wifiBuilder = new NetworkRequest.Builder();
//set the transport type to do wifi
wifiBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
//wifiBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
manager.requestNetwork(wifiBuilder.build(),mWifiNetworkCallback);


}

}


onResume(在 MainActivity.java 中)

    @Override
public void onResume(){
super.onResume();

try {
forceWifiNetwork myWifiNetwork = new forceWifiNetwork(this);
myWifiNetwork.cellConnect();
if (myWifiNetwork.mWifiNetwork == null) {
Log.i("onResume", "mWifiNetwork is null");
} else {
Log.i("onResume", "mWifiNetwork is not null");
}
}catch(Exception e){
Log.i("ERROR IN ONRESUME","error");
e.printStackTrace();
}


}

我目前在 AndroidManifest.xml 中也拥有这些权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

最佳答案

forceWifiNetwork的启动移至onCreate而不是onResume中。我相信 ConnectivityManager.Networkcallback 中的 onAvailable 方法可能具有一些底层异步属性。它看起来像这样。

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//creating network variables that store wifi and cell networks
myWifiNetwork = new forceWifiNetwork(this);


try {
myWifiNetwork.cellConnect();
if (myWifiNetwork.mWifiNetwork == null) {
Log.i("onCreate", "mWifiNetwork is null");
} else {
Log.i("onCreate", "mWifiNetwork is not null");
}
}catch(Exception e){
Log.i("Error in onCreate","error creating network");
e.printStackTrace();
}


}

关于java - 当指定仅使用 wifi 时,ConnectivityManager Network 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58206511/

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