2015-03-13 44 views
1

我試圖通過偵聽代碼中下面顯示的「SUPPLICANT_CONNECTION_CHANGE_ACTION」來檢測WiFi是否連接。但問題是當我運行應用程序時,我收到了來自我註冊的廣播接收器的通知!broadCast接收器永遠不會被調用

爲什麼會發生這種情況,以及如何解決它?

代碼

IntentFilter intentFilter2 = new IntentFilter(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ConnectivityModule(); 
} 

protected void ConnectivityModule() { 
    // TODO Auto-generated method stub 
    Log.d(TAG, "@interNetConnectivityModule: called"); 
    registerReceiver(SupplicantReceiver, intentFilter2); 
} 

BroadcastReceiver SupplicantReceiver = new BroadcastReceiver() { 

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

     final String action = intent.getAction(); 

     if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
      SupplicantState supplicantState = (SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); 

      if (supplicantState == (SupplicantState.COMPLETED)) { 
       Log.d(TAG, "@SupplicantReceiver: connected"); 
      } 

      if (supplicantState == (SupplicantState.DISCONNECTED)) { 
       Log.d(TAG, "@SupplicantReceiver: not connected"); 
      } 
     } 
    } 
}; 
+1

在清單中設置的所有權限? – Opiatefuchs 2015-03-13 10:45:49

+0

是設置了所有權限,並且在運行時,我在logcat中沒有收到任何錯誤 – rmaik 2015-03-13 10:52:01

+0

您是否還在清單中註冊了接收器? – 2015-03-13 11:18:57

回答

0

下面是實施例:

主要活動

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.content.Intent; 
import android.view.View; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
    // broadcast a custom intent. 
    public void broadcastIntent(View view) 
    { 
     Intent intent = new Intent(); 
     intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); 
     sendBroadcast(intent); 
    } 
} 

我的廣播接收器:

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

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); 
    } 

} 

這就是你應該在你的清單聲明廣播接收器:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.helloworld" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <receiver android:name="MyReceiver"> 
      <intent-filter> 
      <action android:name="com.tutorialspoint.CUSTOM_INTENT"> 
      </action> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <Button android:id="@+id/btnStartService" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/broadcast_intent" 
    android:onClick="broadcastIntent"/> 

</LinearLayout> 
0

您的接收機尋找正確登記(在運行時,不是基於清單,但不管,應該不錯無論如何)。

我猜..你試圖把日誌中onReceive方法類似

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

    Log.d(TAG, "Reached this point, receiver is working"); 
    final String action = intent.getAction(); 

    if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
     SupplicantState supplicantState = (SupplicantState)intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); 

     if (supplicantState == (SupplicantState.COMPLETED)) { 
      Log.d(TAG, "@SupplicantReceiver: connected"); 
     } 

     if (supplicantState == (SupplicantState.DISCONNECTED)) { 
      Log.d(TAG, "@SupplicantReceiver: not connected"); 
     } 

     Log.d(TAG, "Checking for an error in retrieving data!"); 
     boolean myTest = intent.getBooleanExtra(EXTRA_SUPPLICANT_CONNECTED, false); 

     if (myTest) Log.d(TAG, "This way it worked!"); 
      else Log.d(TAG, "This does not mean it didn't work at all! Might just be the correct value as a DISCONNECTED status"); 

    } else Log.d(TAG, "Bizzarre error, action received was different from the one receiver was registered to! [ " + action + " ] "); 

} 

我的猜測是,你可能會試圖檢索以錯誤的方式的信息,並與日誌,以便嚴格定義你不能看到足夠的發生,但接收器工作正常

+0

謝謝,我試過你的答案,但仍然同樣的事情,當我打開和關閉無線網絡時,我收不到通知 – rmaik 2015-03-13 11:48:23

+0

我試着用給出的代碼和我的增強日誌創建一個新的Android項目。 在清單中沒有設置權限。 結果是接收方工作,但最初使用的日誌(SupplicantState.COMPLETED和DISCONNECTED)永遠不會啓動,因爲supplicantState始終爲空。相反,我的每個日誌都正在正確地啓動 – FrancescoC 2015-03-13 12:06:11

相關問題