Android:连续扫描所有AP(接入点)
Android: Scan all APs (access points) continuously
我对 android 应用程序开发还很陌生。我正在开发一个 android 应用程序来 ping 访问点以访问其 RSSI 值以估计用户的位置。
虽然我目前有这个 'working',但我相信我的实现中存在一个错误,导致对 "onReceive()" 的调用过多。在应用程序的整个生命周期中,对该函数的调用量呈线性增加。
我即将编写的代码 post 的目标是简单地扫描 WiFi 接入点,获取它们的 RSSI 值,然后连续循环。电池寿命不是问题,性能才是更重要的指标。
MainActivity.java:
Handler handler = new Handler();
final Runnable locationUpdate = new Runnable() {
@Override
public void run() {
getLocation();
//customView.setLocation(getX_pixel(curLocation.getX()), getY_pixel(curLocation.getY()));
//customView.invalidate();
handler.postDelayed(locationUpdate, 1000);
}
};
private void getLocation() {
Context context = getApplicationContext();
WifiScanReceiver wifiReceiver = new WifiScanReceiver();
registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.startScan();
Log.d("START SCAN CALLED", "");
}
然后在同一个文件中,在 onCreate() 方法中:
handler.post(locationUpdate);
然后在同一个文件中,在 onCreate() 方法之外:
class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent intent) {
WifiManager wifiManager = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> scan = wifiManager.getScanResults();
// Application specific code:
sortScan(scan);
count+= 1;
System.out.println("Count: " + count);
}
}
};
我确认了ramping/thread的问题,因为我在程序到达"sortScan(scan)"时递增并输出到控制台,你可以清楚地看到结果是线性上升的。
正如我之前所说,我的意图是在第一次扫描完成后立即重新扫描,并在应用程序的整个生命周期内循环扫描。
非常感谢任何帮助,谢谢。
您每次 运行 getLocation()
都会创建一个新的广播接收器。这些接收者中的每一个都会收到 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
广播。尝试在适当的上下文中分配和注册接收器一次,并且仅在 getLocation()
.
中调用 startScan()
您正在重复注册您的接收器,而不是 necessary.Just在 onCreate() 中只注册一次 WifiScanReceiver。然后在getLocation()函数中调用start scan。
WifiManager wifiManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
Context context = getApplicationContext();
WifiScanReceiver wifiReceiver = new WifiScanReceiver();
registerReceiver(wifiReceiver, new
IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
wifiManager =
(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
Handler handler = new Handler();
final Runnable locationUpdate = new Runnable() {
@Override
public void run() {
getLocation();
//This line will continuously call this Runnable with 1000 milliseconds gap
handler.postDelayed(locationUpdate, 1000);
}
};
private void getLocation() {
wifiManager.startScan();
Log.d("START SCAN CALLED", "");
}
}
class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent intent) {
if(intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)){
//New scan results are available. Arrange a callback to the activity here.
}
}
}
您不应在 onReceive() 中进行繁重的处理。安排回拨给 Activity 以执行此操作。
连续循环扫描 WiFi AP 的 RSSI 值的最佳方法是简单地在 OnCreate 中开始第一次扫描。然后在 BroadcastReceiver 的 onReceive 回调中,再次调用 start scan。
我对 android 应用程序开发还很陌生。我正在开发一个 android 应用程序来 ping 访问点以访问其 RSSI 值以估计用户的位置。
虽然我目前有这个 'working',但我相信我的实现中存在一个错误,导致对 "onReceive()" 的调用过多。在应用程序的整个生命周期中,对该函数的调用量呈线性增加。
我即将编写的代码 post 的目标是简单地扫描 WiFi 接入点,获取它们的 RSSI 值,然后连续循环。电池寿命不是问题,性能才是更重要的指标。
MainActivity.java:
Handler handler = new Handler();
final Runnable locationUpdate = new Runnable() {
@Override
public void run() {
getLocation();
//customView.setLocation(getX_pixel(curLocation.getX()), getY_pixel(curLocation.getY()));
//customView.invalidate();
handler.postDelayed(locationUpdate, 1000);
}
};
private void getLocation() {
Context context = getApplicationContext();
WifiScanReceiver wifiReceiver = new WifiScanReceiver();
registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.startScan();
Log.d("START SCAN CALLED", "");
}
然后在同一个文件中,在 onCreate() 方法中:
handler.post(locationUpdate);
然后在同一个文件中,在 onCreate() 方法之外:
class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent intent) {
WifiManager wifiManager = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
List<ScanResult> scan = wifiManager.getScanResults();
// Application specific code:
sortScan(scan);
count+= 1;
System.out.println("Count: " + count);
}
}
};
我确认了ramping/thread的问题,因为我在程序到达"sortScan(scan)"时递增并输出到控制台,你可以清楚地看到结果是线性上升的。
正如我之前所说,我的意图是在第一次扫描完成后立即重新扫描,并在应用程序的整个生命周期内循环扫描。
非常感谢任何帮助,谢谢。
您每次 运行 getLocation()
都会创建一个新的广播接收器。这些接收者中的每一个都会收到 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
广播。尝试在适当的上下文中分配和注册接收器一次,并且仅在 getLocation()
.
startScan()
您正在重复注册您的接收器,而不是 necessary.Just在 onCreate() 中只注册一次 WifiScanReceiver。然后在getLocation()函数中调用start scan。
WifiManager wifiManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
Context context = getApplicationContext();
WifiScanReceiver wifiReceiver = new WifiScanReceiver();
registerReceiver(wifiReceiver, new
IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
wifiManager =
(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
Handler handler = new Handler();
final Runnable locationUpdate = new Runnable() {
@Override
public void run() {
getLocation();
//This line will continuously call this Runnable with 1000 milliseconds gap
handler.postDelayed(locationUpdate, 1000);
}
};
private void getLocation() {
wifiManager.startScan();
Log.d("START SCAN CALLED", "");
}
}
class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent intent) {
if(intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)){
//New scan results are available. Arrange a callback to the activity here.
}
}
}
您不应在 onReceive() 中进行繁重的处理。安排回拨给 Activity 以执行此操作。
连续循环扫描 WiFi AP 的 RSSI 值的最佳方法是简单地在 OnCreate 中开始第一次扫描。然后在 BroadcastReceiver 的 onReceive 回调中,再次调用 start scan。