2012-01-27 43 views
5

tôi muốn bắt đầu ứng dụng của tôi khi wifi sẽ được bật để tôi cố gắng có được hành động cho nhà nước wifi chức năng thay đổi, nhưng nó cho thấykết nối wifi thay đổi hành động trong 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 

đây là file manifest của tôi

<?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 hướng dẫn tôi cách bắt đầu hoạt động của mình khi bật 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(); 
 } 
} 

} 

đây là mã BroadcastReceiver tôi

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

Vui lòng đăng nguồn của hoạt động WiFiDemo của bạn. Tôi đoán rằng không có máy thu phát sóng nào được đăng ký. Nhưng, tôi không thể nói trừ khi bạn đăng nguồn. :) – Jonathan

+0

@ Jonathan bây giờ tôi cập nhật mã của tôi .. –

+0

Cảm ơn, tôi đã đăng câu trả lời cho thấy rằng bạn di chuyển việc triển khai BroadcastReceiver của mình thành một lớp ẩn danh. Sau đó, bạn sẽ không cần phải lo lắng về việc chuyển tham chiếu đến Hoạt động WiFiDemo. – Jonathan

Trả lời

2

lớp nhận của bạn không có một constructor mặc định. Chỉ một hàm tạo yêu cầu WiFiDemo để android không thể tìm ra cách tạo một thể hiện của lớp đó.

Cập nhật: Tôi nghĩ bạn đã nhầm lẫn một chút về cách người nhận phát sóng hoạt động. Có hai cách:

  1. Bạn mô tả nó trong bạn xml và Android sẽ thể hiện đối tượng khi sự kiện xảy ra - trong trường hợp này bạn cần hàm tạo mặc định, ví dụ: public MyReceiver() {} thay vì public MyReceiver(MyObject obj) {}

  2. Bạn đăng ký bộ nhận phát sóng của mình bằng mã. Loại này có thể có bất kỳ hàm tạo nào.

Vì vậy, để giải quyết vấn đề của bạn. Chỉ cần xóa giảm tốc của bộ thu phát sóng trong tệp kê khai của bạn.

+0

cảm ơn bạn đã bình luận của bạn, bạn có thể vui lòng giải thích cho tôi qua mã. cảm ơn bạn trước .. –

+0

@ user1105375 Ok, hãy đọc mã hoàn chỉnh ngay bây giờ và hướng dẫn bạn đã theo dõi. Đã cập nhật câu trả lời. – tidbeck

0

Android sẽ không thể khởi tạo lớp đó vì hàm tạo yêu cầu WiFiDemo.

Tại sao không chỉ khiến người nhận truyền hình của bạn ẩn danh?

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

một lần nữa phải đối mặt với cùng một lỗi 01-27 18: 03: 26.500: E/AndroidRuntime (19704): java.lang.RuntimeException: Không thể khởi tạo bộ thu com.example.WiFiDemo: java.lang.ClassCastException: com.example.WiFiDemo không thể truyền tới android.content.BroadcastReceiver –

+0

Số dòng là gì? Đó là một lỗi khác, BTW. – Jonathan

+0

Tìm thấy lỗi, xóa: 'if (receiver == null) receiver = new WiFiScanReceiver (this);' – Jonathan

Các vấn đề liên quan