2011-08-13 21 views
5

wifiスキャンが完了したときにトーストメッセージを表示するためのシンプルなブロードキャスト受信機を作成しました。何も表示されていません。ここに私のコードは次のとおりです。ここでWifiスキャン結果放送受信機が動作しない

package com.wifi; 

import java.util.List; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.ScanResult; 
import android.net.wifi.WifiManager; 
import android.widget.Toast; 

public class wifiReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context,"Scan completed", Toast.LENGTH_LONG).show(); 

    } 

} 

マニフェストファイルです:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.wifi" 
     android:versionCode="1" 
     android:versionName="1.0"> 


    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".wifi" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    <receiver android:name=".wifiReceiver"> 
     <intent-filter> 
      <action android:name="android.net.wifi.SCAN_RESULTS"></action> 
     </intent-filter> 
    </receiver> 
    </application> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
</manifest> 
+0

これは、 http://stackoverflow.com/questions/4238921/android-detect-whether-there-is-an-internet-connection-available – androidnoob

+0

は運の@Nikudを思わないに役立つかもしれません...私は同様の問題を見た – gumuruh

答えて

10

、それが欠落している物事のカップルがあります;-)
ことは容易ではありません...ここ は一例です無線LANのスキャンの - オリジナルのソースコードはここにあり

package com.android.wifitester; 

import java.util.List; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.wifi.ScanResult; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 

public class WifiTester extends Activity { 
TextView mainText; 
WifiManager mainWifi; 
WifiReceiver receiverWifi; 
List<ScanResult> wifiList; 
StringBuilder sb = new StringBuilder(); 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    mainText = (TextView) findViewById(R.id.mainText); 
    mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    receiverWifi = new WifiReceiver(); 
    registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    mainWifi.startScan(); 
    mainText.setText("\\nStarting Scan...\\n"); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    menu.add(0, 0, 0, "Refresh"); 
    return super.onCreateOptionsMenu(menu); 
} 

public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    mainWifi.startScan(); 
    mainText.setText("Starting Scan"); 
    return super.onMenuItemSelected(featureId, item); 
} 

protected void onPause() { 
    unregisterReceiver(receiverWifi); 
    super.onPause(); 
} 

protected void onResume() { 
    registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    super.onResume(); 
} 

class WifiReceiver extends BroadcastReceiver { 
    public void onReceive(Context c, Intent intent) { 
     sb = new StringBuilder(); 
     wifiList = mainWifi.getScanResults(); 
     for(int i = 0; i < wifiList.size(); i++){ 
      sb.append(new Integer(i+1).toString() + "."); 
      sb.append((wifiList.get(i)).toString()); 
      sb.append("\\n"); 
     } 
     mainText.setText(sb); 
    } 
} 
} 
+0

あなたのマニフェストに設定されている単純な受信機では、それは行われていないのですか?あなたはあなたの活動を通してそれをしなければなりませんか? –

0

http://www.androidsnippets.com/scan-for-wireless-networks私は私のmanifesで次の作業上記のコードを持っていますT:

<receiver android:name="com.mumfordmedia.trackify.WifiReceiver" android:enabled="true"> 
<intent-filter> 
    <action android:name="android.net.wifi.SCAN_RESULTS"></action> 
</intent-filter> 

注意アンドロイド両方:レシーバー要素に有効=「true」属性、および「とは対照的にメッセージを受信したときに実行すべきクラスへのフルパス。 クラス名」出発点のため

すべてのベストと感謝、 マックス

0

私は上記のMaxの答えを開始し、それが働いていたとき、私はアンドロイドを削除するために進めた:。。有効= 『』真と「仕事」とは、MyReceiverがWiFiをオン/オフしたときにブロードキャストを受信したことを意味します(私はそうしませんでした)エキストラなど)に突く。私はまた、

<receiver android:name=".MyReceiver"> 
<intent-filter> 
<!-- 
<action android:name="android.net.wifi.STATE_CHANGED"/> 
--> 
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
<action android:name="android.net.wifi.SCAN_RESULTS"/> 
</intent-filter> 
+0

は、使用許可タグを実装する適切な方法ですか?私はここでそれを見ていない... @PVS、代わりにアクションタグの下に置く? – gumuruh

1

。ACCESS_WIFI_STATEとCHANGE_WIFI_STATE権限を持っている私は何を最高やったとPVSは、使用権限を削除しましたが、まだスキャン操作を行っています。あなたは何の用途-権限を持っていない場合は、ドキュメントを見てみると、マニフェスト

から削除

は、あなたの受信機は、誰にとして無制限で送信することができますが、あなたは私たちが権限を使用している場合、その後の放送は、同様の権限を持っている必要がありそうです。

私はこれを多くのアクション(以下)で受信機でテストし、取得しました。しかし、いったん私が何らかの種類の使用許可を入れると、私は放送がなくなり、奇妙なものになります。

<receiver android:name=".myReceiver" android:enabled="true"> 
     <intent-filter android:priority="99999999999"> 
      <action android:name="android.intent.action.FOUND" /> 
      <action android:name="android.location.PROVIDERS_CHANGED" />    
      <action android:name="android.hardware.action.NEW_PICTURE" /> 
      <action android:name="android.hardware.action.NEW_VIDEO" /> 
      <action android:name="android.net.wifi.STATE_CHANGE" /> 
      <action android:name="android.net.wifi.NETWORK_IDS_CHANGED" /> 
      <action android:name="android.net.wifi.SCAN_RESULTS" /> 
      <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> 
      <action android:name="android.net.wifi.supplicant.STATE_CHANGE" /> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
      <category android:name="android.intent.category.DEFAULT" />   
     </intent-filter>    
    </receiver> 
2

私はこれに少し時間をかけましたが、これは実行しているAndroidのバージョンによって異なります。 Android Mの場合、位置情報サービスを有効にする必要があるようですので、この基準に該当する場合はコードに追加してください。

private static final int PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION = 1001; 

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 
     requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, 
             int[] grantResults) { 
    if (requestCode == PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION 
      && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     // TODO: What you want to do when it works or maybe .PERMISSION_DENIED if it works better 
    } 
} 

は、マニフェストに以下を追加することを忘れないでください:

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

うまくいけば、このことができます。

関連する問題