2009-11-28 34 views
14

Đây là những gì tôi muốn làm:ANDROID: nếu WiFi được kích hoạt và hoạt động, khởi động một ý định

=> NẾU WiFi được kích hoạt và hoạt động, khởi động một ý định (trong thực tế đó là một WebView mà được nội dung của nó => hướng dẫn của ứng dụng của tôi trên web)

=> NẾU KHÔNG, thì tôi sẽ khởi chạy ý định khác để tôi không hiển thị WebView với "Trang web không khả dụng ... Trang web tại http://www.mywebsite.com có thể tạm thời ngừng hoạt động hoặc có thể đã di chuyển ... "

Tôi nên sử dụng ban đầu

if (wifi.isWifiEnabled())

nhưng điều đó không nói nếu kết nối Wifi có HOẠT ĐỘNG hay không. Nó chỉ nói rằng người dùng đã bật công tắc. Thiết bị có thể hoặc có thể không được kết nối ... Có đúng không?

Sau đó, tôi cố gắng sử dụng:

if (wifi.getConnectionInfo() getSSID() = null.!)

nhưng tôi nhận thấy rằng nó trả về một chuỗi ngay cả khi kết nối đã bị mất hoặc có bị vô hiệu hóa ...?

Tôi nên làm gì sau đó?

wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
Intent intent_instructions; 

      if (wifi.getConnectionInfo().getSSID()!= null){ 
       Log.i("Hub", "WiFi is enabled AND active !"); 
       Log.i("Hub", "SSID = "+wifi.getConnectionInfo().getSSID()); 
       intent_instructions = new Intent(this, Instructions.class); 
      }else{ 
       Log.i("Hub", "NO WiFi"); 
       intent_instructions = new Intent(this, Instructions_No_WiFi.class); 
      } 
      this.startActivity(intent_instructions); 

Có cách nào tổng quát hơn để kiểm tra xem thiết bị có kết nối Internet trước khi khởi chạy ý định không? thông qua Wifi, 3G, v.v.

Cảm ơn bạn đã trợ giúp.

+0

WIFI_STAT_ENABLED chỉ có nghĩa là đài WIFI đang bật. Điều này không liên quan đến việc bạn có thực sự được kết nối với điểm truy cập hay không. –

+1

thực sự, vậy bạn sẽ đề xuất điều gì? – Hubert

+0

Có thể trùng lặp [cách xem wifi có được kết nối trong android] không (http://stackoverflow.com/questions/3841317/how-to-see-if-wifi-is-connected-in-android) –

Trả lời

20

Bạn có thể sử dụng đoạn mã sau để kiểm tra các kết nối:

private static boolean isConnected(Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) 
     context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo networkInfo = null; 
    if (connectivityManager != null) { 
     networkInfo = 
      connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    } 
    return networkInfo == null ? false : networkInfo.isConnected(); 
} 

Hãy chắc chắn rằng bạn đã đăng ký mục đích android.net.conn.CONNECTIVITY_CHANGE trong Manifest của bạn, hoặc nếu không, bạn sẽ không bao giờ nhận được thông báo rằng bạn đang trực tuyến.

Tôi đã đấu tranh với vấn đề này trong vài ngày qua và tôi vừa mới nhận ra rằng tôi cần đăng ký CONNECTIVITY_CHANGE và không chỉ WIFI_STATE_CHANGED.

+0

Sẽ không thích hợp hơn nếu bạn đặt tên cho phương thức này là 'isConnectedViaWiFi'? –

5

Bạn có thể làm điều đó như sau:

@Override 
    public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 

     if(WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)){ 

     Log.d("WIFI", "WIFI has changed"); 
     int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, -1); 
     Log.d("WIFI", "WIFI State = " + wifiState); 
     setCurrentWifiState(wifiState); 

     } 

Bạn sẽ nhận được 0,1,2,3 tùy thuộc vào nêu rõ Wifi là trong, vì vậy ví dụ 2 được kết nối, bạn có thể kiểm tra phần còn lại trong các tài liệu

8

Hãy thử android.net.ConnectivityManager.getActiveNetworkInfo(): nếu nó trả về null bạn không có kết nối; nếu trả về đối tượng NetworkInfo, bạn có thể kiểm tra trạng thái của kết nối bằng NetworkInfo.getState() và nếu đó là NetworkInfo.State.CONNECTED thì bạn đã kết nối, nếu không bạn sẽ không kết nối.

+0

sẽ thử cảm ơn. H. – Hubert

+1

thực sự hoạt động rất tốt, cảm ơn bạn. – Hubert

2

Trong lớp BroadcastReceiver của bạn:

@Override 
public void onReceive(Context context, Intent intent) { 
String action = intent.getAction(); 
    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){     
     boolean connected = intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false); 
     if (connected){ 
      // start your service here 
     } 
    }     
} 

Và trong AndroidManifest.xml của bạn chắc chắn rằng bạn đăng ký tham gia quảng bá ý định android.net.wifi.supplicant.CONNECTION_CHANGE.

<intent-filter >  
    <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> 
</intent-filter> 
0

isConnected() doesnt làm việc hoàn toàn ok, một cái gì đó nghiên cứu khác

final ConnectivityManager connMgr = (ConnectivityManager) 
     this.getSystemService(Context.CONNECTIVITY_SERVICE); 
final android.net.NetworkInfo wifi = 
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

    final android.net.NetworkInfo mobile = 
    connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 

    if(wifi.isAvailable() && wifi.getDetailedState() == DetailedState.CONNECTED){ 
     Toast.makeText(this, "Wifi" , Toast.LENGTH_LONG).show(); 
    } 
    else if(mobile.isAvailable() && mobile.getDetailedState() == DetailedState.CONNECTED){ 
     Toast.makeText(this, "Mobile 3G " , Toast.LENGTH_LONG).show(); 
    } 
    else 
    { 
     Toast.makeText(this, "No Network " , Toast.LENGTH_LONG).show(); 
    } 

kiểm tra mã này nếu bạn đang có wifi hoặc 3g hoặc không có gì, trong trường hợp của wifi trên nhưng không kết nối với một mạng lưới hoặc 3g có vấn đề về tín hiệu, nó phát hiện chi tiết này, với DetailedStates

Các vấn đề liên quan