2015-06-03 4 views
11

У меня есть способ установить флажок, если соединение WIFI было отключено или отключено ИЛИ если пользователь действительно изменил сеть WIFI?Android проверить статус WIFI (отключен или пользователь изменен WIFI) Как FLAG это?

Мне нужно мое приложение: Подключитесь к 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 

Service Monitor:

@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 get disconnect it wont connect again, и если пользователь переключается на другой Wi-Fi, это не позволит подключиться.

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

ответ

6

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

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 
} 
3

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

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 завивку ission

0

Что вы сделали, это почти правильно. вам нужно проверить сетевое имя 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, поэтому постарайтесь, чтобы проверить с вашим именем Wi-Fi и SSID, то вы получите, чтобы узнать состояние соединения ..... Удачного программирования

0

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

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

Так верить, что Wi-Fi полностью вверх, я теперь добавил проверку, что:

boolean isConnected = activeNetworkInfo.isConnected(); 

и DetailedState.CONNECTED :)

счастливым кодирования