wifi connection changed action in android

混江龙づ霸主 提交于 2019-12-10 14:44:15

问题


i want to start my application when wifi will be turn on so that i try get action for wifi state changed function but it showing

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

this is my manifest file

<?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 guide me how to start my activity when wifi is turn on.

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

}

here is my BroadcastReceiver code

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

}

回答1:


Your receiver class does not have a default constructor. Only a constructor that requires a WiFiDemo so android cannot figure out how to make an instance of that class.

Update: I think you have been a bit confused on how broadcast receivers work. There are two ways:

  1. You describe it in you xml and Android will instance the object when the event happens - in this case you need a default constructor e.g. public MyReceiver() {} instead of public MyReceiver(MyObject obj) {}

  2. You register your broadcast receiver in code. This type can have any constructor.

So to solve you issue. Just remove the deceleration of the broadcast receiver in your manifest.




回答2:


Android will not be able to instantiate that class because the constructor requires a WiFiDemo.

Why not just make your broadcast receiver anonymous?

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

    }


来源:https://stackoverflow.com/questions/9031952/wifi-connection-changed-action-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!