2011-08-13 7 views
5

Napisałem prosty odbiornik, aby wyświetlić komunikat toast po zakończeniu skanowania wifi. Nic nie jest wyświetlane. Tu jest mój kodu:Wifi - wyniki skanowania odbiornik nie działa

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(); 

    } 

} 

Oto manifest file:

<?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

To może pomóc http://stackoverflow.com/questions/4238921/android-detect-whether-there-is-an-internet-connection-available – androidnoob

+0

wydaje bez powodzenia @Nikud ...Widziałem podobny problem, – gumuruh

Odpowiedz

10

dobrze, to nie takie proste ;-)
istnieje kilka rzeczy brakuje ... tutaj jest przykładem od skanowania wifi - oryginalny kod źródłowy znajduje się tutaj http://www.androidsnippets.com/scan-for-wireless-networks

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

Więc z prostym odbiornikiem w twoim manifeście to nie jest zrobione? Musisz to zrobić poprzez swoją aktywność? –

0

dostałem powyższy kod do pracy z następujących w moim 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> 

Wskazówka zarówno android: enabled = „true” atrybut w elemencie odbiornika, a pełna ścieżka do klasy, które powinny być wykonane po otrzymaniu wiadomości, w przeciwieństwie do”. classname.”.

wszystkiego najlepszego i dziękujemy za punkt wyjścia, Max

0

Zacząłem odpowiedź Maxa powyżej, a gdy to działało, I przystąpił do usuwania android: enabled = "true" i następnie zmienił android: name = ". MyReceiver" (nie pełna ścieżka). Nadal działał (2.2, API 8). Przez "pracę" rozumiem, że MyReceiver otrzymywał audycje, gdy włączałem i wyłączałem Wi-Fi (nie miałem kłuć w dodatki itp.) mam też uprawnienia ACCESS_WIFI_STATE i 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

jest to właściwy sposób na implementację znaczników use-permission? Nie widziałem tego tutaj ... @PVS, zamiast tego umieściłeś go pod znacznikiem akcji? – gumuruh

1

zrobiłem co max i PVS zrobił, ale także usunął uprawnienia do używania i nadal wykonuje akcję skanowania.

Usunięto z oczywistego

Patrząc na docs, jeśli nie mają uprawnień następnie uses-odbiornik jest nieograniczony co do których można wysyłać, ale wydaje się nam, jeśli wykorzystuje uprawnienia nadawane wówczas musi mieć podobne uprawnienia.

Przetestowałem to z wieloma działaniami (poniżej) w odbiorniku i otrzymałem je. Ale gdy tylko wprowadzę wszystkie uprawnienia do używania, nie otrzymam żadnych transmisji, dziwne.

<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

Spędziłem trochę czasu na tym, a to, w zależności od wersji Androida, może Ci pomóc. W przypadku Androida M wydaje się, że musisz włączyć usługi lokalizacyjne, więc spróbuj dodać to do swojego kodu, jeśli spełniasz te kryteria.

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 
    } 
} 

Nie zapomnij dodać następujące swoim manifeście:

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

Mam nadzieję, że to pomaga.