2015-10-27 74 views
4

ConnectivityManager的getAllNetworkInfo()已過時的API 23和評論它說使用getAllNetworks()代替。 但是我發現這些不具有相同的行爲。例如,如果手機有一個活動蜂窩網絡可用,但wifi當前已打開,則getAllNetworkInfo()將返回兩個網絡(它將顯示無線連接和蜂窩連接斷開連接)。getAllNetworkInfo()已過時併購,但其更換有差異的行爲

然而getAllNetwork()只返回在這種情況下,WiFi網絡。如果wifi關閉,它將返回蜂窩網絡。換句話說,它似乎只返回當前活動的網絡(但是有另一種方法是getActiveNetworkInfo())。

除了getAllNetworkInfo()僅返回一個網絡,getAllNetworks()也僅退休一個網絡。

棉花糖,我怎麼能得到相同的行爲getAllNetworkInfo()即得到可用,他們是否斷開或連接的所有網絡的列表?

最後,我想知道,如果蜂窩數據連接。目前,使用新的ConnectivityManager API,我看不到任何這樣做的方式。

如果下面的代碼符合SDK 22並在M上運行,那麼它將列出兩個網絡,如果將getAllNetworkInfo()交換爲getAllNetworks()(以及網絡< - > NetworkInfo的相應更改)並使用SDK23編譯並運行在同一臺設備上,只列出一個網絡。

public static synchronized void checkNetworkConnectivity() 
{ 
     Context context; 
     context = CityIdApplication.getHandsetState().getContext(); 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo [] networks = cm.getAllNetworkInfo(); 
     //Network[] networks = cm.getAllNetworks(); 
     if (networks != null) { 
      for (Network network : networks) { 
       NetworkInfo info = cm.getNetworkInfo(network); 
       if (info.isAvailable()) { 
        if (info.isConnected()) { 
         Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName() 
           + "], state: " + info.getDetailedState()); 
        } else 
         Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName() 
           + "], state: " + info.getDetailedState() + "=== isAvailable"); 
       } else 
        Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName() 
          + "], state: " + info.getDetailedState() + "=== NOT Available"); 
      } 
    } 
+0

當您調用getAllNetworkInfo時會拋出哪個異常? 我測試getAllNetworkInfo在Android M(API 23)模擬器仍然工作(雖然編譯與棄用警告)。 – kzz

+0

@kzz,我誤解了它的投擲。一些其他的CM方法現在會拋出,比如startUsingNetworkFeature() – Gruntcakes

+0

嘗試挖掘android的源代碼。 :) 我相信他們改變了API的行爲。而且沒有一種「合法」的方式來實現你想要的。 – ProblemSlover

回答

-1

爲什麼不使用registerNetworkCallback

NetworkRequest request = new NetworkRequest.Builder() 
    .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) 
    .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 
    .build(); 
final ConnectivityManager manager = getSystemService(ConnectivityManager.class); 
manager.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback(){ 
    @Override 
    public void onAvailable(Network network) { 
     NetworkInfo info = manager.getNetworkInfo(network); 
     Log.v(TAG, "== NETWORK type: " + info.getTypeName() + "[" + info.getSubtypeName() + "], state: " + info.getDetailedState()); 
    });