2012-01-27 26 views
5

chcę uruchomić mój wniosek po wifi będzie włączyć tak, że ja spróbować dostać funkcję działanie na stan wifi zmieniło ale pokazującwifi zmieniło działań w android

01-27 15:52:10.470: ERROR/AndroidRuntime(11584): java.lang.RuntimeException: Unable to instantiate receiver com.example.WiFiScanReceiver: java.lang.InstantiationException: com.example.WiFiScanReceiver 

to jest mój plik manifestu

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 package="com.example" android:versionCode="1" android:versionName="1.0"> 
 <application android:icon="@drawable/icon" android:label="@string/app_name" 
   android:theme="@android:style/Theme.Light"> 
   <activity android:name=".WiFiDemo" 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="com.example.WiFiScanReceiver"> 
     <intent-filter> 
       <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE" /> 
     </intent-filter> 
   </receiver> 
 </application> 
 <uses-sdk android:minSdkVersion="3" /> 
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"> </uses-permission> 
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
<uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 

i fallow this link poprowadź mnie, jak rozpocząć moją działalność po włączeniu wifi.

package com.example; 

import java.util.List; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.IntentFilter; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

public class WiFiDemo extends Activity implements OnClickListener { 
private static final String TAG = "WiFiDemo"; 
WifiManager wifi; 
BroadcastReceiver receiver; 

TextView textStatus; 
Button buttonScan; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 

 // Setup UI 
 textStatus = (TextView) findViewById(R.id.textStatus); 
 buttonScan = (Button) findViewById(R.id.buttonScan); 
 buttonScan.setOnClickListener(this); 

 // Setup WiFi 
 wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

 // Get WiFi status 
 WifiInfo info = wifi.getConnectionInfo(); 
 textStatus.append("\n\nWiFi Status: " + info.toString()); 

 // List available networks 
 List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 
 for (WifiConfiguration config : configs) { 
  textStatus.append("\n\n" + config.toString()); 
 } 
  
 // Register Broadcast Receiver 
 if (receiver == null) 
  receiver = new WiFiScanReceiver(this); 

 registerReceiver(receiver, new IntentFilter(
   WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
 Log.d(TAG, "onCreate()"); 
} 

@Override 
public void onStop() { 
 super.onStart(); 
 unregisterReceiver(receiver); 
} 

public void onClick(View view) { 
 Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
   Toast.LENGTH_LONG).show(); 

 if (view.getId() == R.id.buttonScan) { 
  Log.d(TAG, "onClick() wifi.startScan()"); 
  wifi.startScan(); 
 } 
} 

} 

tutaj jest mój kod BroadcastReceiver

package com.example; 

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.util.Log; 
import android.widget.Toast; 

public class WiFiScanReceiver extends BroadcastReceiver { 
 private static final String TAG = "WiFiScanReceiver"; 
 WiFiDemo wifiDemo; 

 public WiFiScanReceiver(WiFiDemo wifiDemo) { 
   super(); 
   this.wifiDemo = wifiDemo; 
 } 

 @Override 
 public void onReceive(Context c, Intent intent) { 
   List<ScanResult> results = wifiDemo.wifi.getScanResults(); 
   ScanResult bestSignal = null; 
final String action = intent.getAction(); 
   if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
  System.out.println("booladsssssssssssssssssssssssssssssss"); 
  
 } 
   for (ScanResult result : results) { 
     if (bestSignal == null 
         || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
       bestSignal = result; 
   } 

   String message = String.format("%s networks found. %s is the strongest.", 
       results.size(), bestSignal.SSID); 
   Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); 

   Log.d(TAG, "onReceive() message: " + message); 
 } 

} 
+0

Proszę zaksięgować źródło swojej aktywności WiFiDemo. Zgaduję, że nie zarejestrowano odbiornika telewizyjnego. Ale nie mogę powiedzieć, dopóki nie opublikujesz źródła. :) – Jonathan

+0

@ Jonathan teraz aktualizuję mój kod .. –

+0

Dzięki, wysłałem odpowiedź, która sugeruje, że przeniesiesz swoją implementację BroadcastReceiver do anonimowej klasy. Wtedy nie będziesz musiał się martwić o podanie odniesienia do działania WiFiDemo. – Jonathan

Odpowiedz

2

Twoja klasa odbiornik nie posiada konstruktora domyślnego. Tylko konstruktor, który wymaga WiFiDemo, więc Android nie może dowiedzieć się, jak wykonać instancję tej klasy.

Aktualizacja: Myślę, że nieco się zdezorientowałeś, jak działają odbiorniki telewizyjne. Istnieją dwa sposoby:

  1. opisać to w sobie xml i Android będzie instancja obiektu, gdy zdarzenie - w tym przypadku trzeba konstruktora domyślnego np public MyReceiver() {} zamiast public MyReceiver(MyObject obj) {}

  2. Możesz zarejestrować swój odbiornik w kodzie. Ten typ może mieć dowolny konstruktor.

Tak, aby rozwiązać problem. Po prostu usuń spowolnienie odbiornika transmisji w twoim manifeście.

+0

dziękuję za komentarz, proszę wyjaśnić mi kod. z góry dziękuję. –

+0

@ user1105375 OK, przeczytaj pełny kod teraz i samouczek, którego przestrzegałeś. Zaktualizowano odpowiedź. – tidbeck

0

Android nie będzie mógł utworzyć instancji tej klasy, ponieważ konstruktor wymaga WiFiDemo.

Dlaczego po prostu nie uczynić swojego odbiornika anonimowym?

package com.example; 

    import java.util.List; 

    import android.app.Activity; 
    import android.content.BroadcastReceiver; 
    import android.content.Context; 
    import android.content.IntentFilter; 
    import android.net.wifi.WifiConfiguration; 
    import android.net.wifi.WifiInfo; 
    import android.net.wifi.WifiManager; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    public class WiFiDemo extends Activity implements OnClickListener { 
    private static final String TAG = "WiFiDemo"; 
    WifiManager wifi; 
    BroadcastReceiver receiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context c, Intent intent) { 
      List<ScanResult> results = wifi.getScanResults(); 
      ScanResult bestSignal = null; 
      final String action = intent.getAction(); 
      if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) { 
       System.out.println("booladsssssssssssssssssssssssssssssss"); 

      } 
      for (ScanResult result : results) { 
       if (bestSignal == null || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
         bestSignal = result; 
      } 

      String message = String.format("%s networks found. %s is the strongest.", 
      results.size(), bestSignal.SSID); 
      Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show(); 

      Log.d(TAG, "onReceive() message: " + message); 
     } 

    }; 

    TextView textStatus; 
    Button buttonScan; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Setup UI 
     textStatus = (TextView) findViewById(R.id.textStatus); 
     buttonScan = (Button) findViewById(R.id.buttonScan); 
     buttonScan.setOnClickListener(this); 

     // Setup WiFi 
     wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

     // Get WiFi status 
     WifiInfo info = wifi.getConnectionInfo(); 
     textStatus.append("\n\nWiFi Status: " + info.toString()); 

     // List available networks 
     List<WifiConfiguration> configs = wifi.getConfiguredNetworks(); 
     for (WifiConfiguration config : configs) { 
     textStatus.append("\n\n" + config.toString()); 
     } 

     // Register Broadcast Receiver   
     registerReceiver(receiver, new IntentFilter(
     WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     Log.d(TAG, "onCreate()"); 
    } 

    @Override 
    public void onStop() { 
     super.onStart(); 
     unregisterReceiver(receiver); 
    } 

    public void onClick(View view) { 
     Toast.makeText(this, "On Click Clicked. Toast to that!!!", 
     Toast.LENGTH_LONG).show(); 

     if (view.getId() == R.id.buttonScan) { 
     Log.d(TAG, "onClick() wifi.startScan()"); 
     wifi.startScan(); 
     } 
    } 

    } 
+0

ponownie twarz ten sam błąd 01-27 18: 03: 26.500: E/AndroidRuntime (19704): java.lang.RuntimeException: nie można utworzyć wystąpienia odbiornika com.example.WiFiDemo: java.lang.ClassCastException: com.example.WiFiDemo nie może być cast to android.content.BroadcastReceiver –

+0

Jaki jest numer wiersza? To jest inny błąd, BTW. – Jonathan

+0

Znalazłem błąd, usuń: 'if (receiver == null) receiver = new WiFiScanReceiver (this);' – Jonathan

Powiązane problemy