Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

wifi connection changed action in android

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

}
like image 437
Gurumoorthy Arumugam Avatar asked Nov 05 '22 06:11

Gurumoorthy Arumugam


1 Answers

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.

like image 68
tidbeck Avatar answered Nov 15 '22 01:11

tidbeck