梁开东 发表于 2017-5-29 14:39:16

android6.0以上扫描并获取wifi列表

android6.0以上扫描并获取wifi列表需要打开GPS才有效,否则,获取到的wifi列表为空。
它的实现在:
/**
   * Return the results of the most recent access point scan, in the form of
   * a list of {@link ScanResult} objects.
   * @return the list of results
   */
    public List<ScanResult> getScanResults(String callingPackage) {
      enforceAccessPermission();
      int userId = UserHandle.getCallingUserId();
      int uid = Binder.getCallingUid();
      boolean canReadPeerMacAddresses = checkPeersMacAddress();
      boolean isActiveNetworkScorer =
                NetworkScorerAppManager.isCallerActiveScorer(mContext, uid);
      boolean hasInteractUsersFull = checkInteractAcrossUsersFull();
      long ident = Binder.clearCallingIdentity();
      try {
            if (!canReadPeerMacAddresses && !isActiveNetworkScorer
                  && !isLocationEnabled(callingPackage)) {
                return new ArrayList<ScanResult>();
            }
            if (!canReadPeerMacAddresses && !isActiveNetworkScorer
                  && !checkCallerCanAccessScanResults(callingPackage, uid)) {
                return new ArrayList<ScanResult>();
            }
            if (mAppOps.noteOp(AppOpsManager.OP_WIFI_SCAN, uid, callingPackage)
                  != AppOpsManager.MODE_ALLOWED) {
                return new ArrayList<ScanResult>();
            }
            if (!isCurrentProfile(userId) && !hasInteractUsersFull) {
                return new ArrayList<ScanResult>();
            }
            return mWifiStateMachine.syncGetScanResultsList();
      } finally {
            Binder.restoreCallingIdentity(ident);
      }
    }
重点:
if (!canReadPeerMacAddresses && !isActiveNetworkScorer
                  && !isLocationEnabled(callingPackage)) {
                return new ArrayList<ScanResult>();
            }
也就是说谷歌要求我们在定位的时候同时开启GPS的开关,当然这个有可能是谷歌考虑到自己的接口可以通过wifi列表定位,所以要求开发者要让用户有这个知情权吧。
页: [1]
查看完整版本: android6.0以上扫描并获取wifi列表