wifi连接改变了android中的动作

Gur*_*gam 5 android android-wifi

我想启动我的应用程序,当wifi将打开,以便我尝试获取行动的WiFi状态更改功能,但它显示

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
Run Code Online (Sandbox Code Playgroud)

这是我的清单文件

<?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>
Run Code Online (Sandbox Code Playgroud)

我休闲这个链接指导我如何在打开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();
  }
 }

}
Run Code Online (Sandbox Code Playgroud)

这是我的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);
  }

}
Run Code Online (Sandbox Code Playgroud)

tid*_*eck 2

您的接收器类没有默认构造函数。只有需要 so android 的构造函数WiFiDemo才能弄清楚如何创建该类的实例。

更新:我认为您对广播接收器的工作原理有点困惑。有两种方法:

  1. 你在 xml 中描述它,Android 将在事件发生时实例化该对象 - 在这种情况下,你需要一个默认的构造函数,例如public MyReceiver() {}而不是public MyReceiver(MyObject obj) {}

  2. 您在代码中注册您的广播接收器。该类型可以有任何构造函数。

所以来解决你的问题。只需在清单中删除广播接收器的减速即可。