Bog*_*hai 5 java android wifimanager android-wifi
我需要每秒扫描并获取附近接入点的BSSID/MAC地址和信号电平几次.WifiManager.startScan()扫描大约3.5秒,这有点慢.(对于其他人来说好于6秒,但对我来说仍然太慢).我正在寻找一种方法来获得每200毫秒或甚至更少的结果.
我正在尝试构建一个使用WiFi信号而不是GPS的定位应用程序.到目前为止,除了我需要获取大量数据以获得准确一致的结果之外,这是非常好的.
我需要从我能找到的每个接入点获取BSSID和信号电平,然后存储这些数据供以后使用.我已经尝试使用WifiManager和BroadcastReceiver扫描并获得扫描结果.他们的问题是他们真的很慢.单次扫描至少需要3秒钟.在3秒内信号电平值会改变,导致结果不准确.我还需要进行数千次扫描,这将耗费大量时间.到目前为止,我还没有找到替代方案.我的手机目前正在运行Android 8.0.0
也许如果我优化我的代码,扫描会更快?
onCreate方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor);
btnMainActivity = (Button) findViewById(R.id.button_ToMainActivity);
btnGetWifiInfo = (Button) findViewById(R.id.button_GetWifiInfo);
textWifiInfo = findViewById(R.id.textView_wifiInfo);
textWifiNr = findViewById(R.id.textView_wifiNr);
mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
mWifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
getScanResultInfo();
timeDifference = SystemClock.elapsedRealtime() - startTime;
textWifiInfo.setText("Seconds elapsed: "+Double.toString(timeDifference /1000.0));
nrOfScans++;
if (nrOfScans < 10){
mWifiManager.startScan();
}
}
};
getWifiInfo();
toMainActivity();
}
public void getScanResultInfo(){
int level;
List<ScanResult> wifiScanList = mWifiManager.getScanResults();
textWifiNr.setText("Nr of detected APs: "+ wifiScanList.size());
for (ScanResult scanResult : wifiScanList) {
level = WifiManager.calculateSignalLevel(scanResult.level, 5);
Log.d("WIFI","Level is " + level + " out of 5 " + scanResult.level + " on " + scanResult.BSSID + " ");
}
}
Run Code Online (Sandbox Code Playgroud)
当我按下按钮时,扫描开始.
public void getWifiInfo(){
btnGetWifiInfo.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
finePermission = false;
startTime = SystemClock.elapsedRealtime();
nrOfScans = 0;
checkPermissions();
if ( finePermission == true){
((WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE)).startScan();
mWifiManager.startScan();
}
else {
Log.d("WIFI"," Missing Permissions: "+finePermission);
}
}
}
);
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢您的时间!
您可以使用隐藏的 API startscanActive 跳过被动通道扫描。startScanActive 不是 android 参考中公开的 API;因此,使用它的风险由您自行承担。如果您必须使用它,请参阅此 - https://github.com/mozilla/MozStumbler/issues/40
另请注意,如果 API 确实只扫描主动通道(顾名思义),则您将无法在扫描结果中获取被动通道上存在的 AP
| 归档时间: |
|
| 查看次数: |
1010 次 |
| 最近记录: |