Сеть ConnectivityManager является нулевой, когда указывается использовать только Wi-Fi - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь сохранить сеть Wi-Fi (и, возможно, сотовую сеть) через ConnectivityManager для последующего использования в моей программе для одновременной отправки данных через локальную сеть Wi-Fi или сотовую сеть. Я следил за этим постом ( Заставьте Android одновременно использовать WiFi для общения с устройством и мобильными данными для общения с сервером? и Как оставаться на связи через мобильную сеть после подключения WIFI на Android? ), чтобы попытаться запустить его. Однако mWifiNetwork является нулевым. В режиме отладки переменная mWifiNetwork отображается как "108", а затем, когда метод '' 'onAvailable' '' завершен, переменная возвращается к нулю. Не уверен, почему переменная не хранит сеть правильно.

Я создал класс forceWifiNetwork, который вызывается в onResume

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" />

1 Ответ

0 голосов
/ 03 октября 2019

Переместить инициацию forceWifiNetwork в onCreate вместо onResume. Я полагаю, что метод onAvailable в ConnectivityManager.Networkcallback может иметь некоторые базовые свойства Async. Это будет выглядеть примерно так.

    @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();
        }


    }

...