文章目錄
- 配置百度提供的 Android定位SDK
- 用于發布的 SHA1
- 用于測試的 SHA1
- 使用百度定位實例
配置百度提供的 Android定位SDK
詳情參見官方文檔,這里僅對獲取 SHA1 做詳細介紹:
用于發布的 SHA1
用于測試的 SHA1
使用百度定位實例
public class LocationActivity extends AppCompatActivity {private static final String TAG = "LocationActivity";public LocationClient locationClient;private TextView positionText;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.location_layout);// setAgreePrivacy接口需要在LocationClient實例化之前調用// 如果setAgreePrivacy接口參數設置為了false,則定位功能不會實現// true,表示用戶同意隱私合規政策// false,表示用戶不同意隱私合規政策LocationClient.setAgreePrivacy(true);try {// 通過getApplicationContext獲取的全進程有效的Context來初始化LocationClient對象locationClient = new LocationClient(getApplicationContext());} catch (Exception e) {e.printStackTrace();Log.e(TAG, "onCreate: LocationClient初始化ERROR");}// 不同意隱私政策可能導致locationClient為空if (locationClient != null){// 注冊監聽器locationClient.registerLocationListener(new MyLocationClickListener());}positionText = findViewById(R.id.position_TextView);// 一次進行多個權限申請List<String> permissionList = new ArrayList<>();if (ContextCompat.checkSelfPermission(LocationActivity.this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if (ContextCompat.checkSelfPermission(LocationActivity.this,Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.READ_PHONE_STATE);}if (ContextCompat.checkSelfPermission(LocationActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);}if (!permissionList.isEmpty()) {String[] permissions = permissionList.toArray(new String[permissionList.size()]);ActivityCompat.requestPermissions(LocationActivity.this, permissions, 1);}else {requestLocation();}}public class MyLocationClickListener extends BDAbstractLocationListener {@Overridepublic void onReceiveLocation(BDLocation bdLocation) {StringBuilder currentPosition = new StringBuilder();currentPosition.append("緯度:").append(bdLocation.getLatitude()).append("\n");currentPosition.append("經度:").append(bdLocation.getLongitude()).append("\n");currentPosition.append("國家:").append(bdLocation.getCountry()).append("\n");currentPosition.append("省:").append(bdLocation.getProvince()).append("\n");currentPosition.append("市:").append(bdLocation.getCity()).append("\n");currentPosition.append("區:").append(bdLocation.getDistrict()).append("\n");currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n");currentPosition.append("定位方式: ");if(bdLocation.getLocType() == BDLocation.TypeGpsLocation) {currentPosition.append("GPS");}else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) {currentPosition.append("網絡");}else {currentPosition.append("其他方式");}positionText.setText(currentPosition);}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {case 1:if (grantResults.length > 0){for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "必須同意所有權限才能使用本程序",Toast.LENGTH_LONG).show();finish();return;}}requestLocation();}else {Toast.makeText(this, "申請權限時發生未知錯誤", Toast.LENGTH_LONG).show();Log.e(TAG, "onRequestPermissionsResult:待申請權限個數<=0");finish();}}}private void requestLocation() {initLocation(); // 實時更新位置,沒有該方法則只會定位一次locationClient.start(); // 開始定位}// 配置定位SDK參數private void initLocation() {LocationClientOption option = new LocationClientOption();option.setScanSpan(5000); // 5秒更新一次位置// 設置定位模式option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);// 提供根據經緯度分析處于哪個國家、省、市、區、街道的功能option.setIsNeedAddress(true);locationClient.setLocOption(option);}@Overrideprotected void onDestroy() {super.onDestroy();// 活動被銷毀時通過stop()方法停止定位// 防止程序在后臺持續定位消耗手機電量locationClient.stop();}
}
利用 LocationClientOption 類配置定位 SDK 參數:
LocationClientOption.setLocationMode()
可以設置定位模式,而 LocationClientOption.LocationMode
中有四種模式可選:
- Hight_Accuracy: 高精度模式(默認模式),優先使用 GPS 定位,無法接受 GPS 信號時使用網絡定位;
- Fuzzy_Locating: 模糊定位模式,
v9.2.8
版本開始支持,可以降低 API 的調用頻率,但同時也會降低定位精度; - Battery_Saving: 節電模式,只會使用網絡定位。
- Device_Sensors: 傳感器模式,只會使用 GPS 定位。
定位 SDK 能夠返回三種坐標類型的經緯度(國內),分別是:
- GCJ02(國測局坐標)
- BD09(百度墨卡托坐標)
- BD09ll(百度經緯度坐標),若想將定位 SDK 獲得的經緯度直接在百度地圖上標注,請選擇該類型。
自 V6.2.3
版本起,全新升級了全球定位能力,在海外地區定位所獲得的經緯度,坐標類型默認、且只能是WGS84類型。