Android wifi扫描仪显示无结果或过程缓慢

Android wifi扫描仪显示无结果或过程缓慢,android,wifi,android-wifi,wifimanager,Android,Wifi,Android Wifi,Wifimanager,我编写了一个应用程序来捕获wifi接入点信息。我不明白为什么有时it扫描没有任何结果,而当我在手机设置中关闭和打开wifi时,我可以观察那里的所有接入点。 还有什么方法可以更快地获得wifi扫描的结果?!就像手机在“手机设置”中打开wifi时所做的一样。我将结果指定给一个名为“UMCH_网络”的接入点 谢谢 这是我的.java文件内容: package com.example.wps; import java.util.List; import android.app.Activity; i

我编写了一个应用程序来捕获wifi接入点信息。我不明白为什么有时it扫描没有任何结果,而当我在手机设置中关闭和打开wifi时,我可以观察那里的所有接入点。 还有什么方法可以更快地获得wifi扫描的结果?!就像手机在“手机设置”中打开wifi时所做的一样。我将结果指定给一个名为“UMCH_网络”的接入点 谢谢

这是我的.java文件内容:

package com.example.wps;

import java.util.List;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;


public class MainActivity extends Activity {

TextView mainText;
TextView notifText;
EditText eTxtnumberOfTimes;
EditText eTxtDistance;

WifiManager wifiManager;
WifiReceiver wifiReceiver;
List<ScanResult> wifiList;
StringBuilder sb = new StringBuilder();
Handler handler = new Handler();
String DirectoryName;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    notifText = (TextView) findViewById(R.id.txvMain);
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
}

public void ScanAndDraw(View v) {
    scanwifi();
}

public void scanwifi() {
    wifiReceiver = new WifiReceiver();
    registerReceiver(wifiReceiver, new IntentFilter(
            WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    notifText.setText("Scanning ...");
    wifiManager.startScan();
}

class WifiReceiver extends BroadcastReceiver {
    public void onReceive(Context c, Intent intent) {
        sb = new StringBuilder();
        wifiList = wifiManager.getScanResults();
        for (ScanResult result : wifiList) {
            if (result.SSID.equals("UMCH_Network")) {
                sb.append("Distance: " + eTxtDistance.getText().toString()
                        + "\t");
                sb.append("Number of Times: "
                        + eTxtnumberOfTimes.getText().toString() + "\t");
                sb.append("Level:\t" + result.level + "\t");
                // n=4.48 d0=3meter
                sb.append("estimated distance in meter: "
                        + (3 * (Math.pow(10, (-result.level - 46) / 44.8)))
                        + "\n");
            }
            notifText.setText(sb);
        }

        //mainText.setText(sb);
        notifText.setText("");
    }
}

public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 0, 0, "Refresh");
    return super.onCreateOptionsMenu(menu);
}

protected void onPause() {
    unregisterReceiver(wifiReceiver);
    super.onPause();
}

protected void onResume() {
    registerReceiver(wifiReceiver, new IntentFilter(
            WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    super.onResume();
}

public boolean onTouch(View v, MotionEvent mo) {
    // float x = mo.getX();
    return false;
}
}
package com.example.wps;
导入java.util.List;
导入android.app.Activity;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.content.IntentFilter;
导入android.net.wifi.ScanResult;
导入android.net.wifi.WifiManager;
导入android.os.Bundle;
导入android.os.Handler;
导入android.view.Menu;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.EditText;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
文本视图主文本;
text视图notifText;
编辑文本eTxtnumberOfTimes;
编辑文本eTxtDistance;
WifiManager WifiManager;
WifiReceiver WifiReceiver;
列表wifiList;
StringBuilder sb=新的StringBuilder();
Handler=newhandler();
字符串目录名;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
notifText=(TextView)findViewById(R.id.txvMain);
wifiManager=(wifiManager)getSystemService(Context.WIFI_服务);
}
公共空间扫描和绘制(视图v){
scanwifi();
}
公共无线网络(){
wifiReceiver=新的wifiReceiver();
registerReceiver(wifiReceiver,新意向过滤器(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
notifText.setText(“扫描…”);
wifiManager.startScan();
}
类WifiReceiver扩展了BroadcastReceiver{
接收时公共无效(上下文c,意图){
sb=新的StringBuilder();
wifiList=wifiManager.getScanResults();
用于(扫描结果:wifiList){
if(result.SSID.equals(“UMCH_网络”)){
sb.append(“距离:+eTxtDistance.getText().toString())
+“\t”);
某人追加(“次数:”
+eTxtnumberOfTimes.getText().toString()+“\t”);
sb.append(“Level:\t”+result.Level+“\t”);
//n=4.48 d0=3米
sb.追加(“以米为单位的估计距离:”
+(3*(数学能力(10,(-result.level-46)/44.8)))
+“\n”);
}
notifText.setText(某人);
}
//mainText.setText(sb);
notifText.setText(“”);
}
}
公共布尔onCreateOptions菜单(菜单){
添加(0,0,0,“刷新”);
返回super.onCreateOptions菜单(菜单);
}
受保护的void onPause(){
未注册接收人(wifiReceiver);
super.onPause();
}
受保护的void onResume(){
registerReceiver(wifiReceiver,新意向过滤器(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
super.onResume();
}
公共布尔onTouch(视图v、MotionEvent mo){
//float x=mo.getX();
返回false;
}
}
这是清单文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wps"
android:versionCode="1"
android:versionName="1.0" >

<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.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>

<uses-sdk android:minSdkVersion="3" android:targetSdkVersion="18" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.wps.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


使用此代码,您可以立即显示最近扫描的wifi列表

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        List<ScanResult> apList = wifiManager.getScanResults();
WifiManager WifiManager=(WifiManager)getSystemService(Context.WIFI_服务);
List apList=wifiManager.getScanResults();

我也有同样的问题……我终于找到了解决办法

获取Wifi扫描结果的方法需要GPS处于开启状态并进行粗略定位 文件中的权限


我希望这会有帮助

它运行得非常快,但即使我重新启动应用程序,它也不会更新!有没有办法让它更新@nikvsOn立即启动应用程序,您可以使用上述代码显示列表。同时注册广播接收器进行wifi扫描,并在on receive方法中更新列表。这将类似于我以前编写的代码。这是唯一的方法吗?是的,据我所知,这是唯一的方法。如果我遇到任何其他方法,我一定会让你知道。@Hossein Dolatabadi如果需要,请检查我更新的答案。