WiFi连接在机器人改变行动 [英] wifi connection changed action in android
问题描述
我要开始我的应用程序时的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:机器人=http://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无法弄清楚如何使这个类的一个实例。
更新:
我想你已经对如何广播接收机的工作有点混乱。有两种方式:
-
您描述它在你的XML和Android将实例时该事件发生的对象 - 在这种情况下,你需要一个默认的构造函数如
公共MyReceiver(){}
而不是公共MyReceiver(为MyObject OBJ){}
-
您注册在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:
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 ofpublic MyReceiver(MyObject obj) {}
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屋!