2011-08-13 3 views
5

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


여기 ... 누락 가지의 몇 예입니다 있습니다 ;-) 쉽지 않다, 그것의 여기 내 코드입니다 와이파이 스캔의 - 원본 소스 코드는 여기에

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

내가 위의 최대의 대답으로 시작하고, 그 일을 할 때, 나는 안드로이드 제거 진행 : = 사용 가능" "사실과 "2.2.0, API 8)!"작업을 계속하면 MyReceiver가 WiFi를 켜고 껐을 때 브로드 캐스트를 받았다는 것을 의미합니다 (나는하지 않았습니다. 엑스트라 등을 콕). 또한 ACCESS_WIFI_STATE 및 CHANGE_WIFI_STATE 권한이 있습니다.

<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

은 uses-permission 태그를 구현하는 올바른 방법입니까? 나는 그것을 여기에서 보지 않았다. ..PVS, 그 대신에 당신은 행동 태그의 아래에 그것을 뒀다? – gumuruh

1

나는 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" /> 

는 희망이 도움이됩니다.

관련 문제