wifi连接改变了android中的操作

发布于 2024-12-29 02:36:01 字数 5952 浏览 6 评论 0原文

我想在 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

这是我的清单文件

<?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>

我使用此链接指导我如何在 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();
  }
 }

}

这是我的广播接收器代码

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

}

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

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初心未许 2025-01-05 02:36:01

您的接收器类没有默认构造函数。只有一个需要 WiFiDemo 的构造函数,因此 android 无法弄清楚如何创建该类的实例。

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

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

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

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

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.

空袭的梦i 2025-01-05 02:36:01

Android 将无法实例化该类,因为构造函数需要 WiFiDemo。

为什么不让你的广播接收者匿名呢?

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

    }

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

    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文