首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

百度地圖定位 SDK:如何偵測用戶拒絕定位權限

     編輯:程式設計疑難解答

問題背景

App 使用百度地圖定位 SDK,需在用戶拒絕定位權限時引導開啟。嘗試 PackageManager.checkPermission 失效(只要清單聲明即返回 true);try-catch 捕獲不到異常;BDLocationListener.onReceiveLocation 也不回調。

根本原因

  • Android 6.0+ 運行時權限模型:清單聲明 ≠ 用戶授予。
  • 百度定位 SDK 內部處理權限拒絕時,可能不拋出異常、不回調 onReceiveLocation,導致調用方無感知。

解決方案:雙重保障機制

方案一:運行時權限檢查(標準流程)

// 在啟動定位前檢查
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    // 無權限,請求權限或引導用戶
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQ_LOC);
    return;
}
mLocationClient.start();

方案二:全局 BDLocation 兜底判斷(SDK 特有)

public class MyApplication extends Application {
    public static BDLocation lastLocation = null;
}

public class MyLocationListener implements BDLocationListener {
    @Override
    public void onReceiveLocation(BDLocation location) {
        MyApplication.lastLocation = location; // 成功時更新
    }
}

// 業務使用定位時
if (MyApplication.lastLocation == null || 
    MyApplication.lastLocation.getLocType() == BDLocation.TypeServerError) {
    // 定位失敗(含權限拒絕),引導用戶
    showPermissionGuideDialog();
}

方案三:實現 OnRequestPermissionsResult 回調

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQ_LOC) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            mLocationClient.start();
        } else {
            // 用戶拒絕,引導去設置頁
            showGoToSettingsDialog();
        }
    }
}

最佳實踐總結

  1. 啟動前必檢:用 ContextCompat.checkSelfPermission 而非 PackageManager.checkPermission。
  2. SDK 回調不可靠時:維護全局 BDLocation 實例,null 視為失敗。
  3. 用戶拒絕後:彈窗解釋必要性,提供「去設置」按鈕跳轉應用詳情頁。

代碼片段:跳轉設置頁

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);

總結

百度定位 SDK 權限拒絕無直接回調,需結合「運行時權限預檢」+「全局 Location 兜底判斷」+「請求權限結果回調」三重機制,確保在任何情況下都能感知並引導用戶授權。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved