
作为Android编程的新手,我试图使用WifiManager的getScanResults()方法获取SSID列表,但是即使我已授予它ACCESS_COARSE_LOCATION权限以及CHANGE_WIFI_STATE(对于startScan()方法),该列表仍为空,无论是在清单中还是在运行时检查/请求它.
在SCAN_RESulTS_AVAILABLE_ACTION的广播接收器中,我什至使用键EXTRA_RESulTS_UPDATED检查了意图的额外字段,结果返回true.
但是,List.size()始终返回0.
我在这里想念什么?我正在AndroID 7.0 API 24设备上进行测试.
编辑:代码如下:
MainActivity.java:
public class MainActivity extends Activity implements VIEw.OnClickListener { private static final String TAG="WiFIDemo"; WifiManager wifiManager; WifibroadcastReceiver wifiReceiver; TextVIEw textVIEw; button btn; @OverrIDe protected voID onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate()"); super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); //Check for permissions if ((ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || (ContextCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED)) { Log.d(TAG, "Requesting permissions"); //Request permission ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.ACCESS_NETWORK_STATE}, 123); } else Log.d(TAG, "Permissions already granted"); wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); textVIEw = findVIEwByID(R.ID.text); textVIEw.setTextAlignment(VIEw.TEXT_AlignmENT_TEXT_START); btn = findVIEwByID(R.ID.btn); btn.setonClickListener(this); //Instantiate broadcast receiver wifiReceiver = new WifibroadcastReceiver(); //Register the receiver registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESulTS_AVAILABLE_ACTION)); } @OverrIDe public voID onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { Log.d(TAG, "onRequestPermissionsResult"); switch (requestCode) { case 123: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted Log.d(TAG, "permission granted: " + permissions[0]); } else { // permission denIEd, boo! disable the // functionality that depends on this permission. Log.d(TAG, "permission denIEd: " + permissions[0]); } return; } // other 'case' lines to check for other // permissions this app might request. } } //define class to Listen to broadcasts class WifibroadcastReceiver extends broadcastReceiver { @OverrIDe public voID onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive()"); Toast.makeText(getApplicationContext(), "Scan complete!", Toast.LENGTH_SHORT).show(); boolean ok = intent.getBooleanExtra(WifiManager.EXTRA_RESulTS_UPDATED, false); if (ok) { Log.d(TAG, "scan OK"); //StringBuffer buffer = new StringBuffer(); List<ScanResult> List = wifiManager.getScanResults(); Toast.makeText(getApplicationContext(), Integer.toString(List.size()), Toast.LENGTH_SHORT).show(); for (ScanResult scanResult : List) { //buffer.append(scanResult); textVIEw.append(scanResult.toString()); } } else Log.d(TAG, "scan not OK"); } } @OverrIDe protected voID onStop() { // Todo auto-generated method stub unregisterReceiver(wifiReceiver); super.onStop(); } @OverrIDe public voID onClick(VIEw vIEw) { // Todo auto-generated method stub //Toast.makeText(getApplicationContext(), "All Network seached !!",0).show(); if(vIEw.getID()==R.ID.btn) { Log.d(TAG, "onCreate() wifi.startScan()"); //if (!wifiManager.isWifIEnabled()) // wifiManager.setWifIEnabled(true); wifiManager.startScan(); } }}在清单中:
<?xml version="1.0" enCoding="utf-8"?><manifest xmlns:androID="http://schemas.androID.com/apk/res/androID" package="com.wifi2ir.umagi.wifitest2"> <application androID:allowBackup="true" androID:icon="@mipmap/ic_launcher" androID:label="@string/app_name" androID:roundIcon="@mipmap/ic_launcher_round" androID:supportsRtl="true" androID:theme="@style/Apptheme"> <activity androID:name=".MainActivity"> <intent-filter> <action androID:name="androID.intent.action.MAIN" /> <category androID:name="androID.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission androID:name="androID.permission.ACCESS_WIFI_STATE" /> <uses-permission androID:name="androID.permission.CHANGE_WIFI_STATE" /> <uses-permission androID:name="androID.permission.ACCESS_NETWORK_STATE" /> <uses-permission androID:name="androID.permission.ACCESS_COARSE_LOCATION" /> <uses-permission androID:name="androID.permission.ACCESS_FINE_LOCATION" /></manifest>@H_404_26@解决方法:从AndroID 6开始,您必须启用定位服务才能获得所需的结果.授予权限只是完成的一半.
您还可以触发将用户重定向到此设置的意图:
Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivity(myIntent);位置服务是必需的,因为当您访问扫描结果时,您可以访问诸如BSSID(访问点的地址)之类的信息.此信息还可用于检测设备的位置.通过要求位置服务, *** 作系统可确保用户在使用您的应用程序时了解其位置信息正在被访问.
总结以上是内存溢出为你收集整理的Android WifiManager :: getScanResults()仍返回空列表全部内容,希望文章能够帮你解决Android WifiManager :: getScanResults()仍返回空列表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)