Android 百度定位SDK
官方文档:http://lbsyun.baidu.com/index.php?title=android-locsdk
1.获取AK
发布版:
keytool -v -list -keystore key.jks
SHA1:A9:7D:70:70:4C:67:83:71:AC:FD:18:6E:EF:9B:08:FF:CF:07:A6:BD
开发版:
keytool -v -list -keystore debug.keystore
SHA1:39:FC:60:2A:FA:CB:BF:6C:79:CA:98:58:C6:2F:F8:58:FE:56:24:2F
2.创建定位测试项目
1)AndroidManifest.xml
增加权限,声明service和ak鉴权
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<uses-permission android:name="android.permission.VIBRATE" >
</uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_SETTINGS" >
</uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- 声明service组件 -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
<!-- AK鉴权 -->
<!-- meta-data需要写在application中 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="V57HWvyoHwUYEK15Nws2kAZYvSwWtC2q" />
2)导入项目所需的jar包和so
BaiduLBS_Android.jar
libBaiduMapSDK_base_v4_5_2.so
libBaiduMapSDK_map_v4_5_2.so
liblocSDK7b.so
在app的build.gradle android{}中说明so为该libs路径
android {
...
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
}
3.定位流程
1)初始化LocationClient类
LocationClient类最好在主线程中声明,需要Context类型的参数。
Context需要时全进程有效的Context,推荐用getApplicationConext获取全进程有效的Context
mLocClient = new LocationClient(getApplicationContext());
mLocClient.registerLocationListener(listener);
2)配置SDK参数
LocationClientOption option = new LocationClientOption();
option.setIsNeedAddress(true);//是否要地址
option.setOpenGps(true);
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
mLocClient.setLocOption(option);
mLocClient.start();
3)实现BDAbstractLocationListener接口
Android定位SDK自v7.2版本起,对外提供了Abstract类型的监听接口BDAbstractLocationListener,用于实现定位监听。原有BDLocationListener暂时保留,推荐开发者升级到Abstract类型的新监听接口使用,该接口会异步获取定位结果
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.i("bdmap","定位类型:"+bdLocation.getLocTypeDescription()+"\n"
+"纬度:"+bdLocation.getLatitude()+"\n"
+"经度:"+bdLocation.getLongitude()+"\n"
+"详细地址:"+bdLocation.getAddrStr()+"\n"
+"卫星数目"+bdLocation.getSatelliteNumber());
}
输出:
I/bdmap: 定位类型:GPS location successful!
纬度:30.555669
经度:104.075068
详细地址:中国四川省成都市武侯区G213(xxxxxx)
卫星数目4
4.增加Mark
LatLng ll = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_openmap_mark);
// 构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(ll) //mark出现的位置
.icon(bitmap) //mark图标
.draggable(true);//mark可拖动
//在地图上添加Marker并显示
mBaiduMap.addOverlay(option);
//对Marker的点击事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//获取marker中的数据
double lat = marker.getPosition().latitude;
double log = marker.getPosition().longitude;
Toast.makeText(getApplication(),
"经度"+log+" 纬度"+lat,Toast.LENGTH_LONG)
.show();
return false;
}
});
5.Demo
public class MainActivity extends AppCompatActivity {
private MapView mMapView = null;
private BaiduMap mBaiduMap = null;
boolean isFirstLoc = true; // 是否首次定位
LocationClient mLocClient;
private MyLocationData locData; //定位数据包
private Marker marker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mMapView = (MapView)findViewById(R.id.bmapView);
mBaiduMap = mMapView.getMap();
//设置类型
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
mLocClient = new LocationClient(getApplicationContext());
mLocClient.registerLocationListener(listener);
LocationClientOption option = new LocationClientOption();
option.setIsNeedAddress(true);//是否要地址
option.setOpenGps(true);
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
mLocClient.setLocOption(option);
mLocClient.start();
//对Marker的点击事件
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//获取marker中的数据
double lat = marker.getPosition().latitude;
double log = marker.getPosition().longitude;
Toast.makeText(getApplication(),
"经度"+log+" 纬度"+lat,Toast.LENGTH_LONG)
.show();
return false;
}
});
//Map点击事件,点击地图移除marker
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
marker.remove();//移除marker
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
}
/***
* 定位结果回调,在此方法中处理定位结果
*/
BDAbstractLocationListener listener = new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
Log.i("bdmap","定位类型:"+bdLocation.getLocTypeDescription()+"\n"
+"纬度:"+bdLocation.getLatitude()+"\n"
+"经度:"+bdLocation.getLongitude()+"\n"
+"详细地址:"+bdLocation.getAddrStr()+"\n"
+"卫星数目"+bdLocation.getSatelliteNumber());
//构造定位数据
locData = new MyLocationData.Builder()
.accuracy(bdLocation.getRadius())
.latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude())
.build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(bdLocation.getLatitude(),
bdLocation.getLongitude());
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_openmap_mark);
// 构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(ll) //mark出现的位置
.icon(bitmap) //mark图标
.draggable(true);//mark可拖动
//在地图上添加Marker并显示
marker = (Marker) mBaiduMap.addOverlay(option);
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(17.0f);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
};
@Override
protected void onDestroy() {
//退出时销毁定位
mLocClient.stop();
//关闭定位图层
mBaiduMap.setMyLocationEnabled(false);
mMapView.onDestroy();
mMapView = null;
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK
原文: Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37590688/article/details/76072563 前两天学习了一下Android的特色--LBS(基于百度地图Android SDK)。有些坑还是得填下,避免以后用到时忘记了。 一 .申请API_KEY 1)http://lbsyun.baidu.com/ :在这里注册并申请。注册之后出现应用列表 2)选择创建应用:下图所示 PS:SHA1找了我好久 按照书上面的,资料上看了,左侧选择项目目录类型project,打开右侧Gradle–>app–>android–>signingReport,发现,诶,怎么没有。。。。(黑人问号脸??),突然发现左下角有个转换的键(左下标红的地方),一按。。。,答案出来了。 3)完成 创建完成,获得API_KEY。 二 .下载百度定位SDK 下载解压后得到libs文件夹 BaiduLBS_android.jar...
-
下一篇
swift4.1 系统学习三
// // main.swift // swift03 // // Created by iOS on 2018/9/21. // Copyright © 2018年 weiman. All rights reserved. // import Foundation /* swift学习笔记4 */ // 1.元组 /* 元组是swift中一种复合类型。它很强大哦,可以吧任意类型的有限个对象整理为一个对象。 */ do { let a = 10 let b = "小花" let tuple = (a,b) print(tuple) print(tuple.0) } // 注意:如果我们要表示一个元组,那么圆括号中至少要有两个元素,否则,圆括号被看做是圆括号操作符。 //1》访问元组中的元素 //要访问元组的对象,可以使用成员访问操作符.,后面跟上元素的索引位置。 do { let tuple = ("小明","男",8,"北京") print(tuple.0) //输出 “小明” let sex = tuple.1 print(sex) } //我们还可以给元组指定标签进行访问 do ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境