3 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
從Android 6.0開始,權(quán)限行為已更改為運(yùn)行時(shí)。要使用需要許可的功能,應(yīng)首先檢查該許可是否先前已授予。使用checkSelfPermission(permissionString) 方法返回結(jié)果,而權(quán)限為PERMISSION_GRANTED或PERMISSION_DENIED。
如果未授予許可或這是第一次,則應(yīng)提出許可請(qǐng)求。向用戶提供授予或拒絕的選項(xiàng)。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION);
//After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method
}else{
getScanningResults();
//do something, permission was previously granted; or legacy device
}
如果您的代碼在M之前的設(shè)備上運(yùn)行,則繼續(xù)執(zhí)行代碼,使用舊方法授予權(quán)限。
一旦請(qǐng)求許可,對(duì)話框?qū)@示給用戶。他/她的答復(fù)將作為:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Do something with granted permission
mWifiListener.getScanningResults();
}
}
之后,您可以檢查定位服務(wù)是否打開,使用LocationServices.SettingsApi并請(qǐng)求用戶啟用(如果此選項(xiàng)被禁用)。Play服務(wù)LocationSettingsStatusCodes.RESOLUTION_REQUIRED回調(diào)可以做到這一點(diǎn)。

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
我在AOSP問題跟蹤器問題185370中發(fā)現(xiàn)了相關(guān)問題,如果GPS關(guān)閉,則WifiManager#getScanResults()返回一個(gè)空數(shù)組列表。
問題從#1提到,手機(jī)必須打開定位服務(wù)才能獲取手機(jī)的wifi列表。
從#18開始,Android項(xiàng)目成員聲稱開發(fā)團(tuán)隊(duì)已修復(fù)您報(bào)告的問題,并將在以后的版本中提供。
APP位于targetSdkVersion 23中,只需按照上述解決方案檢查運(yùn)行時(shí)權(quán)限即可。強(qiáng)制啟用位置服務(wù)問題將在Android未來版本中修復(fù)。

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
因此,問題似乎出在新的權(quán)限處理上。您必須先獲得許可,然后才能進(jìn)入wifi代碼。這是一個(gè)例子:
// call this method only if you are on 6.0 and up, otherwise call doGetWifi()
private void getWifi() {
if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 0x12345);
} else {
doGetWifi(); // the actual wifi scanning
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 0x12345) {
for (int grantResult : grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
return;
}
}
getWifi();
}
}
此檢查必須在活動(dòng)中完成。
原始示例代碼在此處可用,并根據(jù)本主題中討論的問題進(jìn)行了修改。
原版的
根據(jù)API的鏈接更改,您的應(yīng)用程序必須具有位置權(quán)限之一。引用:
WifiManager.getScanResults():您的應(yīng)用程序必須具有ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION權(quán)限。
另外請(qǐng)注意,您的BroadcastReceiver在執(zhí)行操作時(shí)收到了一個(gè)新的布爾鍵SCAN_RESULTS_AVAILABLE_ACTION:EXTRA_RESULTS_UPDATED。這顯示掃描是否完成,您可以通過調(diào)用來訪問結(jié)果wifiManager.getScanResults()。
- 3 回答
- 0 關(guān)注
- 1934 瀏覽
添加回答
舉報(bào)