2015-04-03 25 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:NAME = 「android.permission.ACCESS_NETWORK_STATE」/>在您的清單。 – 2015-04-03 18:07:36

+0

@Ashton,我有這些權限: <使用權限> <使用權限android:name =「android.permission.INTERNET」/> <使用權限android:name =「android.permission.ACCESS_NETWORK_STATE」/> <使用權限android:name =「 android.permission.CHANGE_NETWORK_STATE「/> – 2015-04-03 18:08:32

回答

1

最佳做法是在manifest.xml中使用廣播接收器

註冊reciever下

<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 – 2015-04-03 18:18:47

+0

IsNetworkAvailable不聽網絡可用性。當網絡可用時,您需要監聽。我建議使用上述方法。 – Ajeet 2015-04-03 18:22:04

+2

具體而言,使用'.isConnectedOrConnecting();'意味着您必須輪詢(設置計時器,繼續調用此方法以確定網絡是否可用)網絡連接:使用廣播接收器意味着您的應用程序將自動更新當網絡狀態改變時 - 這是你想要保持按鈕狀態準確。網絡的類型只是通過傳遞給連接管理器的參數來確定的。 – 2015-04-03 18:31:24

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

所以,你真的檢查,如果移動數據連接,或WiFi正在連接。這聽起來像你不想wifi,所以改變TYPE_WIFITYPE_MOBILE

事實上,它可能會稍微好做:

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

wifi切換按鈕工作正常,現在我正在與移動網絡 – 2015-04-03 18:14:22

+0

相同我的方法 - 不工作( – 2015-04-03 18:26:59

相關問題