WiFi连接在机器人改变行动 [英] wifi connection changed action in android

查看:198
本文介绍了WiFi连接在机器人改变行动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要开始我的应用程序时的WiFi将被打开,这样我试图让行动支持WiFi状态更改的功能
但它显示

  15 01-27:52:10.470:ERROR / AndroidRuntime(11584):了java.lang.RuntimeException:无法实例接收com.example.WiFiScanReceiver:java.lang.InstantiationException: com.example.WiFiScanReceiver

这是我的清单文件

 <?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
 包=com。示例安卓版code =1机器人:=的versionName1.0>
 <应用机器人:图标=@绘制/图标机器人:标签=@字符串/ APP_NAME
 机器人:主题=@安卓风格/ Theme.Light>
 <活动机器人:WiFiDemoNAME =机器人:标签=@字符串/ APP_NAME>
 &所述;意图滤光器>
 <作用机器人:名字=android.intent.action.MAIN/>
 <类机器人:名字=android.intent.category.LAUNCHER/>
 &所述; /意图滤光器>
 < /活性GT;
 <接收机器人:名字=com.example.WiFiScanReceiver>
 &所述;意图滤光器>
 <作用机器人:名字=android.net.wifi.supplicant.CONNECTION_CHANGE/>
 &所述; /意图滤光器>
 < /接收器>
 < /用途>
 <采用-SDK安卓的minSdkVersion =3/>
 <使用许可权的android:NAME =android.permission.ACCESS_WIFI_STATE>< /使用许可权>
 <使用许可权的android:NAME =android.permission.CHANGE_WIFI_STATE>< /使用许可权>
 <使用许可权的android:NAME =android.permission.UPDATE_DEVICE_STATS>< /使用许可权>
 <使用许可权的android:NAME =android.permission.CHANGE_NETWORK_STATE> < /使用许可权>
 <使用许可权的android:NAME =android.permission.WAKE_LOCK>< /使用许可权>
<使用许可权的android:NAME =android.permission.INTERNET对/>
< /清单>

我休耕此链接指导我如何开始我的活动时WiFi是打开。

 包com。示例;进口的java.util.List;进口android.app.Activity;
进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.IntentFilter;
进口android.net.wifi.WifiConfiguration;
进口android.net.wifi.WifiInfo;
进口android.net.wifi.WifiManager;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.TextView;
进口android.widget.Toast;公共类WiFiDemo扩展活动实现OnClickListener {
 私有静态最后弦乐TAG =WiFiDemo;
 WifiManager无线网络;
 广播接收器接收器; TextView的textStatus;
 按钮buttonScan; / **当第一次创建活动调用。 * /
 @覆盖
 公共无效的onCreate(捆绑savedInstanceState){
 super.onCreate(savedInstanceState);
 的setContentView(R.layout.main); //设置UI
 textStatus =(的TextView)findViewById(R.id.textStatus);
 buttonScan =(按钮)findViewById(R.id.buttonScan);
 buttonScan.setOnClickListener(本); //设置无线网络
 无线=(WifiManager)getSystemService(Context.WIFI_SERVICE); //获取无线网络状态
 WifiInfo信息= wifi.getConnectionInfo();
 textStatus.append(\\ n \\ nWiFi状态:+ info.toString()); //列出可用网络
 清单< WifiConfiguration> CONFIGS = wifi.getConfiguredNetworks();
 对于(WifiConfiguration配置:CONFIGS){
 textStatus.append(\\ n \\ n+ config.toString());
 }
 
 //注册广播接收器
 如果(接收== NULL)
 接收器=新WiFiScanReceiver(本); registerReceiver(接收器,新的IntentFilter(
 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
 Log.d(TAG的onCreate());
 } @覆盖
 公共无效的onStop(){
 super.onStart();
 unregisterReceiver(接收机);
 } 公共无效的onClick(查看视图){
 Toast.makeText(这一点,在点击点击。举杯说!
 Toast.LENGTH_LONG).show(); 如果(view.getId()== R.id.buttonScan){
 Log.d(TAG的onClick()wifi.startScan());
 wifi.startScan();
 }
 }}

这是我的BroadcastReceiver code

 包com。示例;进口的java.util.List;进口android.content.BroadcastReceiver;
进口android.content.Context;
进口android.content.Intent;
进口android.net.wifi.ScanResult;
进口android.net.wifi.WifiManager;
进口android.util.Log;
进口android.widget.Toast;公共类WiFiScanReceiver扩展广播接收器{
 私有静态最后弦乐TAG =WiFiScanReceiver;
 WiFiDemo wifiDemo; 公共WiFiScanReceiver(WiFiDemo wifiDemo){
 超();
 this.wifiDemo = wifiDemo;
 } @覆盖
 公共无效的onReceive(上下文C,意图意图){
 清单< ScanResult>结果= wifiDemo.wifi.getScanResults();
 ScanResult bestSignal = NULL;
 最后弦乐行动= intent.getAction();
 如果(action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)){
 的System.out.println(booladsssssssssssssssssssssssssssssss);
 
 }
 对于(ScanResult结果:结果){
 如果(bestSignal == NULL
 || WifiManager.compareSignalLevel(bestSignal.level,result.level)LT; 0)
 bestSignal =结果;
 } 字符串消息=的String.format(%s网络找到。%s是最强的。
 results.size(),bestSignal.SSID);
 Toast.makeText(wifiDemo,消息,Toast.LENGTH_LONG).show(); Log.d(TAG的onReceive()消息:+消息);
 }}


解决方案

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

更新:
我想你已经对如何广播接收机的工作有点混乱。有两种方式:


  1. 您描述它在你的XML和Android将实例时该事件发生的对象 - 在这种情况下,你需要一个默认的构造函数如公共MyReceiver(){} 而不是公共MyReceiver(为MyObject OBJ){}


  2. 您注册在code你的广播接收器。这种类型可以有任何构造函数。


所以要解决你的问题。只是删除广播接收机的减速在你的清单。

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

}

解决方案

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.

这篇关于WiFi连接在机器人改变行动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆