是的,我确实看过所有其他类似的问题,但它们并不适合我。 我想获得一个我附近的无线连接列表。 我就是这样做的:
public class WifiFunction {
private final String tag = WifiFunction.class.getSimpleName();
private WifiManager wifiManager;
public List<WifiDetail> getListofWifi(Context context) {
List<WifiDetail> wifiDetails = new ArrayList<>();
List<ScanResult> results = wifiManager.getScanResults();
Log.d(tag,"Wifi Details " + wifiManager.getScanResults().size());
for (ScanResult result : results) {
wifiDetails.add(new WifiDetail(result.BSSID, result.SSID));
Log.d(tag, result.BSSID + result.SSID);
}
return wifiDetails;
}
public void startScan(Context context)
{
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiManager.startScan();
IntentFilter filter = new IntentFilter();
filter.addAction(SCAN_RESULTS_AVAILABLE_ACTION);
context.registerReceiver(new resultReciever(this),filter);
}
}
接收者类:
public class resultReciever extends BroadcastReceiver {
private WifiFunction wifiFunction;
resultReciever(WifiFunction wifiFunction)
{
this.wifiFunction = wifiFunction;
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d("Receiver","started");
wifiFunction.getListofWifi(context);
}
}
来自主要活动我只是打电话:
(new WifiFunction()).startScan(this);
检查权限后。 是的,我确实在清单中声明了接收器。 我要求访问和更改wifi状态并访问粗略位置。
仍然,Log将返回列表的大小打印为0.我做错了什么?怎么解决?
编辑:清单
<?xml version="1.0" encoding="utf-8"?>
<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.permisiion.ACCESS_COARSE_LOCATION" />
<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>
<receiver android:name=".resultReciever"/>
</application>
编辑2: 运行时权限:
private boolean checkPermission() {
List<String> permissionsList = new ArrayList<String>();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(Manifest.permission.ACCESS_WIFI_STATE);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(Manifest.permission.CHANGE_WIFI_STATE);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (permissionsList.size() > 0) {
ActivityCompat.requestPermissions(this, permissionsList.toArray(new String[permissionsList.size()]),
1);
return false;
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
switch (requestCode) {
case 1:
(new WifiFunction()).startScan(this);
break;
}
}
答案 0 :(得分:2)
有效。我只需要授予Access_Fine_Location权限。
答案 1 :(得分:1)
将以下行添加到清单中并不足以解决问题!
**from urls.py:**
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'', include('website.urls')),
]
**from setting.py:**
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'website',
]
如果你的targetSdkVersion是23或更高,那么(因为这是危险的权限之一)你还必须做这样的事情
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
这样做解决了我和OP的问题。我通过反转更改来重新检查断言以重新创建问题。
注意:这里有两个非常显着的元素:
(1) WifiManager.startScan()需要此权限才能documented。{
(2)我的应用基于正常工作(pre-API 23)应用 NOT Manifest.permission.ACCESS_FINE_LOCATION
答案 2 :(得分:1)
您无权访问Access_Fine_Location
,但从Android 6开始授予所有权限不会产生预期的输出。您必须启用位置服务才能获得所需的结果。授予权限只是完成的一半工作。
您还可以触发将用户重定向到此设置的意图:
Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
位置服务是必要的,因为当您访问扫描结果时,您可以访问BSSID(接入点的地址)等信息。此信息还可用于检测设备的位置。通过要求定位服务,操作系统可确保用户在使用您的应用时了解他们的位置信息。
答案 3 :(得分:0)
你应该在onRequestPermissionResult
上添加它@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
(new WifiFunction()).startScan(this);
break;
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
答案 4 :(得分:0)
成功调用WifiManager.getScanResults()需要任何以下权限之一:
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
CHANGE_WIFI_STATE
如果正在调用的应用没有这些权限,则调用将失败,并显示SecurityException。
因此,Android 8只需启用CHANGE_WIFI_STATE就能检索所有wifi AP
答案 5 :(得分:0)
在您的AndroidManifest.xml中设置权限
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
您应该能够在WifiManger.getScanResults()