Ofe*_*mon 4 android broadcastreceiver wifimanager android-wifi android-broadcast
这是我的代码:
public class FloatWifiManager implements IWifiManager {
private WifiManager wifiManager;
private BroadcastReceiver wifiScanReceiver;
public FloatWifiManager(Context context) {
...
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// Registering Wifi Receiver
wifiScanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
// not getting called, only after running app and manually going to the wifi settings in android
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
context.registerReceiver(wifiScanReceiver, intentFilter);
wifiManager.startScan();
}
Run Code Online (Sandbox Code Playgroud)
我注册的BroadcastReceiver就像我在所有的例子中看到的那样,并且做到了startScan.
会发生什么,wifi列表正在改变(当然,我测试过),但onReceive如果我只是留在应用程序中则不会被调用.
是什么让onReceive终于到了被称为-是启动应用程序,使其保持运行状态,并在Android手机上要设置 - > 无线上网设置.去那里时,List突然更新并被onReceive调用.
这有什么问题?
是否 wifiManager.startScan();只运行一次扫描?或者它是一个持续收听传入"扫描结果"的功能?
显然,为什么接收器不被调用?
是的,startScan()只请求一次扫描.
你可以摆脱这种if (intent.getAction().equals(..))状况.其他任何事情似乎都没问题.
只是为了说清楚 - 我的目标是每当Wifi网络列表发生变化时都会调用一个接收器,而不必点击"开始扫描"按钮.
AFAIK无法在任何wifi网络发生变化时收到通知.您只能请求扫描startScan- 当然您可以startScan使用线程或处理程序重复调用.
文档说,SCAN_RESULTS_AVAILABLE_ACTION当"接入点扫描已完成,结果可从请求者处获得"时,会调用该文档.如何以及何时进行扫描取决于请求者的实施.Elenkov写道,"Android设备很少包含原始的wpa_supplicant代码;所包含的实现经常被修改以更好地与底层SoC兼容".
扫描接入点
此示例扫描可用的接入点和ad hoc网络.btnScan激活WifiManager.startScan()方法启动的扫描.扫描后,WifiManager调用SCAN_RESULTS_AVAILABLE_ACTIONintent,WifiScanReceiver类处理扫描结果.结果显示在a TextView.
public class MainActivity extends AppCompatActivity {
private final static String TAG = "MainActivity";
TextView txtWifiInfo;
WifiManager wifi;
WifiScanReceiver wifiReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wifi=(WifiManager)getSystemService(Context.WIFI_SERVICE);
wifiReceiver = new WifiScanReceiver();
txtWifiInfo = (TextView)findViewById(R.id.txtWifiInfo);
Button btnScan = (Button)findViewById(R.id.btnScan);
btnScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "Start scan...");
wifi.startScan();
}
});
}
protected void onPause() {
unregisterReceiver(wifiReceiver);
super.onPause();
}
protected void onResume() {
registerReceiver(
wifiReceiver,
new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
);
super.onResume();
}
private class WifiScanReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
List<ScanResult> wifiScanList = wifi.getScanResults();
txtWifiInfo.setText("");
for(int i = 0; i < wifiScanList.size(); i++){
String info = ((wifiScanList.get(i)).toString());
txtWifiInfo.append(info+"\n\n");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
权限
需要在AndroidManifest.xml中定义以下权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Run Code Online (Sandbox Code Playgroud)
android.permission.ACCESS_WIFI_STATE打电话是必要的WifiManager.getScanResults().没有android.permission.CHANGE_WIFI_STATE你无法启动扫描WifiManager.startScan().
当编译为API级别23或更高的项目(在Android 6.0及以上),无论是android.permission.ACCESS_FINE_LOCATION或android.permission.ACCESS_COARSE_LOCATION必须插入.此外,需要申请许可,例如在onCreate主要活动的方法中:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
String[] PERMS_INITIAL={
Manifest.permission.ACCESS_FINE_LOCATION,
};
ActivityCompat.requestPermissions(this, PERMS_INITIAL, 127);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8082 次 |
| 最近记录: |