Android проверяет статус WIFI (отключен или пользователь изменен WIFI) Как FLAG это?

У меня есть способ Flag, если соединение WIFI было отключено или отключено ИЛИ, если пользователь действительно изменил сеть WIFI?

Мне нужно мое приложение: Подключитесь к WIFI XYZ, если XYZ получит разъединение (FLAG 1) или выкл. Затем снова подключитесь к XYZ. Но пользователь переходит на другой wifi BTOpen (FLAG 2), затем разрешает подключение и останавливает мой сервис. Если пользователь снова подключится к XYZ, запустите цикл снова.

То, что я получил до сих пор:

    <!-- WIFI Receiver -->
    <receiver android:name=".ReceiverWifi" >
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>
    <service android:name=".ServiceWifiMonitor" />
    <receiver android:name=".ServiceController" >
        <intent-filter >
            <action   android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.action.QUICKBOOT_POWERON" />
        </intent-filter>
    </receiver>

BroadcastReceiver:

    myApplication = (MyApplication) context.getApplicationContext();
    conManager  = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    networkInfo = conManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);


    boolean isConnected = networkInfo != null && networkInfo.isConnected();
    int reconnectedCount = myApplication.getReconnectedCount();


    if (wifiManager.isWifiEnabled()) {


        if("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) {


            //Start and Stop Service
            if(myApplication.isReconnect()) startServiceWifiMonitor(); else stopServiceWifiMonitor();



            if (isConnected) {
                //There is a WIFI Connection
                myApplication.setConnectedWifi(NetworkUtil.getCurrentSSID(context));
                myApplication.setWifiStatus("connected");




                if (NetworkUtil.isConnectedToXYZ(context)) {
                    startServiceWifiMonitor();

                    if(pref.getisFirstTime()) 
                    {
                        myApplication.setWifiByChoise("XYZ");
                        pref.setisFirstTime(false);
                    }
                    else { myApplication.setisReconnect(true); }
                }
                else {
                    //Connected to different NetWork
                    if(myApplication.isReconnect() && NetworkUtil.isXYZAvailable(context)) 
                    {
                        //ReConnect to XYZ
                        NetworkUtil.connectToXYZ(context);
                        myApplication.setReconnectedCount(reconnectedCount++);
                    }
                    else { resetValues("AAAA"); }
                }


            }//end if
            else 
             {
                if(NetworkUtil.isXYZAvailable(context) && myApplication.getWifiByChoise().equals("XYZ")) 
                {
                    NetworkUtil.connectToXYZ(context);
                    myApplication.setReconnectedCount(reconnectedCount++);
                }
                else { resetValues(""); }
            }
        }//end CONNECTIVITY_CHANGE

Сервисный монитор:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "onStartCommand > Received start id " + startId + ": " + intent);

        objHandler.postDelayed(mTasks, 1000);

    return START_STICKY;
}//end onStartCommand



private Runnable mTasks = new Runnable() {
    public void run() {

        if(myApplication.getWifiByChoise().equals("XYZ") && NetworkUtil.isXYZAvailable(context)) {              
            try
             {
                //Get the numbers of Reconnection
                int count = myApplication.getReconnectedCount();

                if(!NetworkUtil.isWifiConnected(context)) 
                {   

                    NetworkUtil.connectToXYZ(context);
                    myApplication.setisReconnect(true);
                    myApplication.setReconnectedCount(count++); 
                }

                if(!NetworkUtil.isConnectedToXYZ(context)) 
                {   

                    NetworkUtil.connectToXYZ(context);
                    myApplication.setisReconnect(true);
                    myApplication.setReconnectedCount(count++);
                }
            } catch (Exception e) {e.printStackTrace();}
        }
        else { stopSelf(); }
        int ms_interval = 3000;
        objHandler.postDelayed(mTasks, ms_interval);
    }
};//end Runnable mTasks 

Проблема с моим приложением заключается в следующем: Он разбил устройство, похоже, что он съедает все память. иногда с Wi-Fi XYZ получить отключить его не будет снова подключаться, и если пользователь переключится на другой Wi-Fi, он не позволит подключиться.

Я очень ценю вашу помощь. Спасибо.

Ответ 1

Проверьте сетевое подключение Name с помощью

public String getWifiName(Context context) {
    WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (manager.isWifiEnabled()) {
         WifiInfo wifiInfo = manager.getConnectionInfo();
         if (wifiInfo != null) {
            DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState());
            if (state == DetailedState.CONNECTED || state == DetailedState.OBTAINING_IPADDR) {
                return wifiInfo.getSSID();
            }
        }
    }
    return null;
}

если это имя соответствует вашему networkSSID, то есть XYZ, чем возобновление службы, иначе если оно не соответствует, чем остановка службы

if getWifiName(this).compareTo("XYZ") == 0 {  //XYZ is your network name on which you want to resume the service
    //code to resume
} else {
    //code to stop the service
}

Ответ 2

Вот как я справляюсь с этим в своем приложении:

public class WifiStateWatcher extends BroadcastReceiver {

    private MainActivity activity;

    public WifiStateWatcher(MainActivity activity) {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        SupplicantState supState;
        WifiManager wifiManager = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        supState = wifiInfo.getSupplicantState();

        if (supState.equals(SupplicantState.COMPLETED)) {
            //we are connected to Wi-Fi network
        } else {
            //we lost Wi-Fi connectivity
        }
    }
}

Вам понадобится android.permission.ACCESS_WIFI_STATE разрешение

Ответ 3

То, что вы сделали, почти правильно. вам нужно проверить сетевое имя ssd с именем пользователя, подключенным к пользователю. Если он будет соответствовать, сделайте свою часть.

WifiManager wifiManager= (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled()) {
    WifiInfo networkInfo = wifiManager.getConnectionInfo();
    if (networkInfo != null) {
        DetailedState state = WifiInfo.getDetailedStateOf(networkInfo .getSupplicantState());
        if (state == DetailedState.CONNECTED ) {
            return networkInfo.getSSID();
        } 
    } 
} 
return null; 

Теперь у вас есть SSID сети, поэтому попробуйте проверить с вашим именем wifi и SSID, после чего вы узнаете статус подключения..... Счастливое программирование

Ответ 4

Также просто проверил это и выяснил, что основное отличие:

/** IP traffic should be available. */
DetailedState.CONNECTED

и

/**
 * …
 * This state indicates that the supplicant has completed its
 * processing for the association phase and that data connection is
 * fully configured. Note, however, that there may not be any IP
 * address associated with the connection yet. Typically, a DHCP
 * request needs to be sent at this point to obtain an address.
 */
SupplicantState.COMPLETED

Итак, чтобы убедиться, что wifi полностью завершен, теперь я добавил проверки:

boolean isConnected = activeNetworkInfo.isConnected();

и DetailedState.CONNECTED:)

счастливое кодирование