2015-04-03 2 views
0

Я пытаюсь кнопку, как это создать (Если мобильная сеть включена зелен, когда он выключен, он серый):Android. Как подключить/выключить мобильный интернет (сеть передачи данных)?

enter image description here

Я пытаюсь определить состояние с помощью этого метода:

public Boolean isDataNetworkEnabled() { 

    ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 

    if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED 
      || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING) { 
     return true; 
    } 

    if (conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED 
      || conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) { 
     return false; 
    } 

    return false; 
} 

Он всегда возвращает значение «false». Даже если после включения мобильной сети. Собственно, как определить состояние мобильной сети?

PS. Я не спрашиваю, как включить/отключить мобильную сеть, я спрашиваю о состоянии. Я уже нашел, как включить/выключить:

try { 
        Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class); 
        if (!isDataNetworkEnabled()) { 
         dataMtd.invoke(dataManager, true); 
         ivDataNetwork.setImageResource(R.drawable.ic_data_usage_black_48dp); 
         Toast.makeText(context, "Data network turned on", Toast.LENGTH_SHORT).show(); 
        } else { 
         dataMtd.invoke(dataManager, false); 
         ivDataNetwork.setImageResource(R.drawable.ic_data_usage_grey600_48dp); 
         Toast.makeText(context, "Data network turned off", Toast.LENGTH_SHORT).show(); 
        } 
       } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } catch (NoSuchMethodException e) { 
        e.printStackTrace(); 
       } 
+0

Убедитесь, что <использует-разрешение андроида: имя = «android.permission.ACCESS_NETWORK_STATE» /> в манифесте. –

+0

@Ashton, у меня есть эти разрешения:

ответ

1

Лучшая практика заключается в использовании радиовещательный приемник

Регистрация в приемник под Manifest.xml

<receiver android:name="com.example.broadcastreciever2.NetworkChangeReciever" > 
      <intent-filter> 
       <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
      </intent-filter> 
     </receiver> 

Также добавьте

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

Определите свой приемник (используйте в соответствии с вашим использованием)

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.widget.Toast; 

public class NetworkChangeReciever extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

     if (checkInternet(context)) { 
      Toast.makeText(context, "Network Available Do operations", 
        Toast.LENGTH_LONG).show(); 
     } 

    } 

    boolean checkInternet(Context context) { 
     ServiceManager serviceManager = new ServiceManager(context); 
     if (serviceManager.isNetworkAvailable()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

} 

Определение ServiceManager путем расширения ContextWrapper

import android.content.Context; 
import android.content.ContextWrapper; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 

public class ServiceManager extends ContextWrapper { 

public ServiceManager(Context base) { 
    super(base); 
} 

public boolean isNetworkAvailable() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = cm.getActiveNetworkInfo(); 
    if (networkInfo != null && networkInfo.isConnected()) { 
     return true; 
    } 
    return false; 
} 

} 
+0

, какой метод я должен использовать для идентификации состояния: isNetworkAvailable из службы или checkInternet из приемника? это только для мобильной сети? потому что я не хочу комбинировать или путать с wifi. –

+0

IsNetworkAvailable не слушает доступность сети. Вы должны слушать, когда сеть доступна. Рекомендую использовать вышеописанный метод. – Ajeet

+2

В частности, использование '.isConnectedOrConnecting();' означает, что вам нужно будет опросить (настроить таймер, продолжить вызов этого метода, чтобы определить, доступна ли сеть) сетевое соединение: использование широковещательного приемника означает, что ваше приложение будет автоматически обновляться когда изменяется состояние сети - именно это вы хотите сохранить в правильном состоянии кнопки. Тип сети определяется только по аргументам, которые вы передаете диспетчеру соединений. –

0

Замены некоторых значений ...

if (conMgr.getNetworkInfo(TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
      || conMgr.getNetworkInfo(TYPE_WIFI).getState() == NetworkInfo.State.CONNECTING) { 
     return true; 
    } 

    if (conMgr.getNetworkInfo(TYPE_MOBILE).getState() == NetworkInfo.State.DISCONNECTED 
      || conMgr.getNetworkInfo(TYPE_WIFI).getState() == NetworkInfo.State.DISCONNECTED) { 
     return false; 
    } 

Таким образом, вы действительно проверку, если мобильные данные подключены, или Wi-Fi подключаются. Похоже, вы не хотите Wi-Fi, поэтому измените TYPE_WIFI на TYPE_MOBILE?

На самом деле это может быть немного лучше сделать:

public boolean isMobileDataNetworkAccessable() { 
    return conMgr.getNetworkInfo(NetworkType.TYPE_MOBILE).isConnectedOrConnecting(); 
} 
+0

wifi toggle кнопка работает правильно, теперь я работаю с мобильной сетью –

+0

такой же, как мой метод - не работает ( –

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