开发者社区> 杰克.陈> 正文

Android 百度定位SDK

简介: 原文:Android 百度定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shui1025701856/article/details/79031834 官方文档:http://lbsyun.
+关注继续查看
原文:Android 百度定位SDK

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shui1025701856/article/details/79031834

官方文档: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();
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
14278 0
android中google“定位查询”编辑
<p>“定位查询”locate()方法,增加一个线程,在该线程中处理查询地点的功能,请参考代码清单16-10,完整代码请参考chapter16_7工程中src/com/work/map/MyMapActivity.java文件locate()方法代码部分。</p> <p>【代码清单16-1】 </p> <pre name="code" class="java">/** * 定位查询
970 0
如何快速定位Android端GPU问题之工具介绍
## GAPID ```GAPID```是```Google```下的一个开源库,可用于记录发送给GPU的API调用及渲染状态检查,目前主要用于Android端,对OpenGL ES及Vulkan的支持最完善,使用此工具可以协助定位排查端上OpenGL ES的渲染效果、渲染状态及错误、渲染绑定的shader等资源,同时可以即时修改渲染每步中的变量值并查看新的渲染效果。 ## 下载安装
1757 0
Android 实现锚点定位
tablayout + scrollview 了解一下
1754 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29153 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20695 0
+关注
杰克.陈
一个安静的程序猿~
10425
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载