2011-08-13 15 views
5

He escrito un receptor de difusión simple para mostrar un mensaje de brindis cuando se completa la exploración wifi. Nada se muestra. Aquí está mi código:Wifi resultados de exploración receptor de difusión no funciona

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

    } 

} 

Aquí está el archivo de manifiesto:

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

Esto podría ayudar http://stackoverflow.com/questions/4238921/android-detect-whether-there-is-an-internet-connection-available – androidnoob

+0

parece que no hay suerte @Nikud, ...vi el problema similar, – gumuruh

Respuesta

10

bien, no es tan fácil ;-)
hay un par de cosas que faltan ... aquí es un ejemplo de una exploración wifi - el código fuente original se encuentra aquí 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

¿Entonces con un receptor simple establecido en su manifiesto no está listo? Tienes que hacerlo a través de tu actividad? –

0

me dieron el código de trabajo con el siguiente en mis 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> 

Aviso tanto el androide: enabled = "true" atributo en el elemento receptor, y la ruta completa a la clase que se debe ejecutar cuando se recibe el mensaje en lugar de". nombre de clase"..

todo lo mejor y gracias por un punto de partida, Max

0

que comenzó con la respuesta de Max arriba, y cuando eso funcionó, que procedió a eliminar el androide: enabled = 'true' y luego cambió el android: name = ". MyReceiver" (no la ruta completa). Continuó funcionando (2.2, API 8). Con "trabajo" me refiero a que MyReceiver recibió transmisiones cuando activé y desconecté el WiFi (no lo hice). hurgar en los extras, etc.). también tengo permisos ACCESS_WIFI_STATE y 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

es esa la forma correcta de implementar uses-permission tag? No lo vi aquí ... @PVS, en cambio lo pones bajo etiqueta de acción? – gumuruh

1

hice lo máximo y PVS lo hizo, pero también eliminó los permisos de uso y aún sigue la acción de escaneo.

Fuera del manifiesto

En cuanto a los documentos si no tiene permisos de usos continuación, el receptor no tiene restricciones en cuanto a quién puede enviar pero parece si nos usa permisos entonces la emisión deben tener permisos similares.

He probado esto con una gran cantidad de acciones (abajo) en un receptor y las obtengo. Pero una vez que pongo permisos de uso de cualquier tipo, no obtengo transmisiones, es extraño.

<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

Pasé algo de tiempo en esto, y dependiendo de qué versión de Android esté ejecutando esto podría ayudar. Para Android M, parece que debes habilitar los servicios de ubicación, así que intenta agregar esto a tu código si estás bajo este criterio.

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

No se olvide de añadir lo siguiente a su manifiesta:

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

Esperemos que esto ayuda.

Cuestiones relacionadas