个人笔记整理
基于位置的服务 百度地图API 申请API前往百度开放服务平台 (baidu.com)注册开发者
来到控制台 | 百度地图开放平台 (baidu.com)创建应用
应用名称随意,应用类型选择【Android SDK】
获取开发版(debug) SHA1前往系统的.android目录,默认位于~/.android
输入命令
E:codeAndroid.android>keytool -list -v -keystore debug.keystore 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: androiddebugkey 创建日期: 2021-2-27 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: C=US, O=Android, CN=Android Debug 发布者: C=US, O=Android, CN=Android Debug 序列号: 1 有效期为 Sat Feb 27 18:40:11 CST 2021 至 Mon Feb 20 18:40:11 CST 2051 证书指纹: MD5: 84:9D:C6:94:D8:2F:C2:90:00:00:00:00:00:00:00:00 SHA1: D2:4C:7C:89:85:83:9A:68:1C:6F:FF:0F:00:00:00:00:00:00:00:00 SHA256: EF:5A:67:E6:15:68:64:05:AD:95:90:7F:0F:5C:34:2B:79:54:15:C0:85:94:1E:9B:00:00:00:00:00:00:00:00 签名算法名称: SHA1withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 1 ******************************************* ******************************************* Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。获取发布板(release) SHA1
Android百度地图开发-第一篇:申请、搭建百度地图 - zhangmiao14 - 博客园 (cnblogs.com)创建相应的签名文件,并获取相应的SHA1
(测试,可以相同)
包名正常设置 点击提交 可复制key,或者[设置]修改上述配置 使用百度定位官方开发文档:Android地图SDK | 百度地图API SDK (baidu.com)
下载&配置SDK 下载SDKSDK下载 - 百度LBS开放平台 (baidu.com)
(根据需要)选择基础定位和基础地图,选择jar格式、标准开发包选择下载
配置SDK解压下载的jar包,然后进入libs目录
选择其中的BaiduLBS_Android.jar文件放入项目中app/libs目录
// gradle中需配置 dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) ... }
之后新建src/main/jniLibs目录,将 剩余所有 复制到此处
项目配置 AndroidManifest配置代码
动态申请权限代码示例
public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient; private TextView positionText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLocationClient = new LocationClient(getApplicationContext()); // 注册一个定位监听器,当获得位置时,就会回调该监听器 mLocationClient.registerLocationListener(new MyLocationListener()); setContentView(R.layout.activity_main); positionText = (TextView) findViewById(R.id.position_text_view); //动态申请权限 // 申请权限较多,建立权限数组 List实时更新位置permissionList = new ArrayList<>(); // 如果没有该权限,就将该权限添加到权限数组中 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } // 如果权限数组不为空,则证明有权限未申请 if (!permissionList.isEmpty()) { // 将该申请的权限转换为String[]数组 String [] permissions = permissionList.toArray(new String[permissionList. size()]); // 进行权限的申请 ActivityCompat.requestPermissions(MainActivity.this, permissions, 1); } else { requestLocation(); } } private void requestLocation() { mLocationClient.start(); } @Override public 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_SHORT).show(); // 如果有权限未被同意,则退出程序 finish(); return; } } //同意所有权限后,加载位置 requestLocation(); } else { Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show(); finish(); } break; default: } } // 获得相应参数 public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { runOnUiThread(new Runnable() { @Override public void run() { StringBuilder currentPosition = new StringBuilder(); currentPosition.append("纬度:").append(location.getLatitude()). append("n"); currentPosition.append("经线:").append(location.getLongitude()). append("n"); currentPosition.append("定位方式:"); if (location.getLocType() == BDLocation.TypeGpsLocation) { currentPosition.append("GPS"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { currentPosition.append("网络"); } positionText.setText(currentPosition); } }); } @Override public void onConnectHotSpotMessage(String s, int i) { } } }
public class MainActivity extends AppCompatActivity { ... private void requestLocation() { initLocation(); mLocationClient.start(); } private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); mLocationClient.setLocOption(option); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); } ... }选择定位模式
上述方式为网络定位
切换到GPS定位。手机设置:位置信息模式→高精确度
定位模式进行指定,一共有3种模式可选:Hight_Accuracy、Battery_Saving和Device_Sensors。
Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使用GPS定位,在无法接收GPS信号的时候使用网络定位。
Battery_Saving表示节电模式,只会使用网络进行定位。
Device_Sensors表示传感器模式,只会使用GPS进行定位。
其中,Hight_Accuracy是默认的模式。
private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); // 设置定位模式 option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors); mLocationClient.setLocOption(option); }显示位置相关信息
// 设置LocationClientOption的 需要获取当前位置详细的地址信息 option.setIsNeedAddress(true); StringBuilder currentPosition = new StringBuilder(); currentPosition.append("纬度:").append(location.getLatitude()). append("n"); currentPosition.append("经线:").append(location.getLongitude()). append("n"); currentPosition.append("国家:").append(location.getCountry()). append("n"); currentPosition.append("省:").append(location.getProvince()). append("n"); currentPosition.append("市:").append(location.getCity()). append("n"); currentPosition.append("区:").append(location.getDistrict()). append("n"); currentPosition.append("街道:").append(location.getStreet()). append("n"); currentPosition.append("定位方式:"); if (location.getLocType() == BDLocation.TypeGpsLocation) { currentPosition.append("GPS"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { currentPosition.append("网络"); } positionText.setText(currentPosition);使用百度地图
添加地图控件
添加Application继承类
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //初始化百度地图 SDKInitializer.initialize(this); } } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); mapView.onDestroy(); } ... }定位到当前位置
先获得地图总控制器
BaiduMap baiduMap = mapView.getMap();
设置缩放级别
// 设置缩放级别(3~21),值越大地图越精细 MapStatusUpdate update = MapStatusUpdateFactory.zoomTo(12.5f); // 最后需要调用该方法 使update的设置生效 baiduMap.animateMapStatus(update);
设置经纬度
LatLng ll = new LatLng(39.915, 116.404); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update);
public class MainActivity extends AppCompatActivity { ... private BaiduMap baiduMap; private boolean isFirstLocate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化要在 setContentView 前 mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new MyLocationListener()); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.bmapView); // 获得Map控制器 baiduMap = mapView.getMap(); // 启用我的位置显示 baiduMap.setMyLocationEnabled(true); ... } private void navigateTo(BDLocation location) { // 判断是不是第一次定位 // 定位到当前位置,同时设置精度 if (isFirstLocate) { LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll); baiduMap.animateMapStatus(update); update = MapStatusUpdateFactory.zoomTo(16f); baiduMap.animateMapStatus(update); isFirstLocate = false; } // 封装设备当前所在位置 MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData = locationBuilder.build(); // 设置上“我的位置” baiduMap.setMyLocationData(locationData); } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location.getLocType() == BDLocation.TypeGpsLocation || location.getLocType() == BDLocation.TypeNetWorkLocation) { // 初始化地图 navigateTo(location); } } } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); mapView.onDestroy(); // 关闭我的位置显示,节约资源 baiduMap.setMyLocationEnabled(false); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)