2014-01-30 3 views
5

Мне нужно заметить изменение сети в системе Android и выполнить соответствующие действия соответственно.Обнаружение Wi-Fi или мобильной сети

1) Когда Wi-Fi включен, выполняет функцию A. 2) Когда к мобильной сети включена, выполняют функцию B. 3) Когда Wi-Fi отключается, и сеть мобильной связи позволяет, остановить функцию А и начать функцию B. 4) Когда мобильная сеть отключена и включен WiFi, остановите функцию B и запустите функцию A. 5) Если сеть недоступна, функция не выполняется.

Я пробовал использовать CONNECTIVITY_CHANGE. С этим я получаю намерение много раз, я тоже знаю его причину. Есть и другая проблема. Учтите, что мобильная сеть включена. Теперь, когда я включаю WiFi, я получаю WiFi в 2 - 3 раза, а также отключена Мобильная сеть.

Я также пробовал зарегистрироваться в PhoneStateListener.LISTEN_DATA_CONNECTION_STATE. Это почти сработало, но, когда подключены как WiFi, так и Mobile Network, я знаю, что WiFi будет активным, и когда я отключу WiFi, иногда я получаю сообщение с поддержкой Mobile Network, и иногда я привык.

Мне нужно решить эту проблему. Пожалуйста, помогите мне с вашим руководством.

ответ

0

Так на самом деле у вас есть четыре состояния, как (+ пятый, если Интернет или нет)

когда сеть доступна, вы должны проверить интернет-провайдера посредством мониторинга состояния Wi-Fi и мобильной сети, ваши четыре состояния

состояния изменения Wi-Fi и

1. Мобильная сеть включена
2. Мобильная сеть отключена

Мобильные состояния изменения сети и

1. Wi-Fi включен
2.Wifi отключен

Прежде всего, вам необходимо следить за тем, доступен ли интернет или нет, после этого вам придется добавить похожих двух слушателей (широковещательные приемники) для изменения состояния Wi-Fi и изменения состояния мобильного телефона и проверить требуемое состояние, я добавил метод проверки состояния ниже,

Ресивер Реализация

проверка изменений в приемнике, а затем проверять состояние

public class Internet_State extends BroadcastReceiver { 
//checked with new state changed when event occurs 
public boolean oldInternetState; 

@Override 
public void onReceive(Context context, Intent intent) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    Bundle b = intent.getExtras(); 
    // if Internet available 
    boolean isConnected = !b 
      .getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY); 
      // ignore if no state change 
    if (oldInternetState == isConnected) 
     return; 
    // set new oldInternetState 
    oldInternetState = isConnected; 
    boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
//you can save these states to be monitored in wifi and mobile change change listners 

    //No internet is 0 state 
    int state = isConnected?1:0; 
      if(state) 
      state = checkState(context) 
    intent.putExtra("state", state); 
      // and then send this intent to your required method which will 
      // check the state and perform function 
} 

@Override 
public void initialize(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
      //save the current internet state at start of the receiver registration 
    oldInternetState = false; 
    if (activeNetwork != null) 
     oldInternetState = activeNetwork.isConnectedOrConnecting(); 
} 

} 

Реализовать два, мобильное и состояние WiFi изменения широковещательных приемников и лучше добавить метод состояния проверки, как этот

Регистрация государство

мониторинг состояния из четырех состояний

public int checkState(Context context){ 
      ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
     boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; 
    boolean isWifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
      .isAvailable(); 
    //No internet is 0 state 
    int state = isConnected?1:0; 
    if(isWifi && isMobile) 
     state = 1; 
    else if(isWifi && !isMobile) 
     state = 2; 
    if(isMobile && isWifi) 
     state = 3; 
    else if(isMobile && !isWifi) 
     state = 4; 
     return state; 
} 

и позвоните по этому методу из 3 Wi-Fi, Интернета и мобильных телефонов ресиверы изменения данных, не забудьте проверить для oldState и сопоставить его с измененным состоянием.

Mobile старое состояние по

NetworkInfo allNetInfo = cm 
      .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    oldDataState = allNetInfo.getState(); 

для Wifi состояния

int state = intent.getExtras().getInt(WifiManager.EXTRA_WIFI_STATE); 
    if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 
    if (state == oldWifiState) 
     return; 
    oldWifiState = state; 

Проблема я получаю включен WiFi 2 до 3 раз

Более одного звонки по Wi-Fi изменение происходит потому, что изменяющиеся состояния Wifi, например TurningOn и TurningOf вызываются ОС, вы должны отменить из них, как я сделал выше, как

if (state == WifiManager.WIFI_STATE_ENABLED) 
     state = 1; 
    else if (state == WifiManager.WIFI_STATE_DISABLED) 
     state = 0; 
    else 
     return; 

только Enabled и Disabled контролируются в настоящее время.

0

Вы можете попробовать зарегистрировать широковещательный приемник, чтобы узнать о смене сети. См .: http://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html.

Будьте осторожны, состояние может меняться слишком много раз и каждый раз, когда ваша трансляция будет запущена.

+0

Это и есть мой вопрос. Как заметить изменения только одним триггером? Кроме того, этот метод позволяет использовать как мобильную сеть, так и Wi-Fi, когда у нас есть оба разрешения. На самом деле Wi-Fi будет активным. Мы должны будем динамически решить, что мобильная сеть отключена, когда включен WiFi. – madhu

1
Please find the below code. I suppose it is what you want. In case I misunderstood you, then please let me know: 


    public void checkWifiMobileNetwork(Context context){ 

      ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 

      if (activeNetwork != null && activeNetwork.isConnected()) { 
       android.net.NetworkInfo connWifiType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
       android.net.NetworkInfo connMobileType = conMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

       if(connWifiType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","WIFI_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","WIFI_IS_NOT_THERE"); 
       } 

       if(connMobileType.isConnectedOrConnecting()){ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_THERE"); 
       }else{ 
        Log.d("NETWORK_STATUS","MOBILE_NETWORK_IS_NOT_THERE"); 
       } 

      }else { 
       //notify user you are not online 
       Log.d("NETWORK_STATUS","WIFI_MOBILE_IS_NOT_THERE"); 

      } 
     } 

Set permission at Manifest: 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
0

Попробуйте этот код в первой операции в приложении.

public class YourActivity extends Activity { 

    Context mContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mContext = this; 
     this.registerReceiver(this.mNetworkConReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); // Here you register your receiver 
    } 

    private BroadcastReceiver mNetworkConReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      ConnectivityManager conMngr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

      if(wifi.isConnected()){ 
       // Wifi is connected 
      }else if(mobile.isConnected() && wifi.isConnected()){ 
       // Mobile Network and Wifi is connected 
      }// Others conditions here... 

     } 
    }; 

} 

Помните: ваш приемник вещания будет инициироваться Android каждый раз при изменении состояния сети.

Смежные вопросы