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();
    }
}
目录
相关文章
|
2天前
|
JavaScript Java Maven
云效产品使用常见问题之android sdk 构建出aar后,上传到私有maven仓库失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
安全 开发工具 Android开发
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
几个Flutter常见诊断错误与解决Android toolchain - develop for Android devices X Unable to locate Android SDK
260 0
|
6月前
|
API 开发工具 Android开发
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
解决 Android App 上架 Google play后 ,签名变更,第三方sdk无法登录
146 0
|
3月前
|
开发工具 Android开发
Android获取SDK的版本信息
Android获取SDK的版本信息
39 0
|
4月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
41 1
|
4月前
|
编解码 Java 开发工具
Android端接入视频生产 Java SDK
Android端接入视频生产 Java SDK
40 1
|
4月前
|
监控 Java 开发工具
基于Eclipse+SDK+ADT+DDMS的安卓开发环境完整搭建过程
基于Eclipse+SDK+ADT+DDMS的安卓开发环境完整搭建过程
45 0
基于Eclipse+SDK+ADT+DDMS的安卓开发环境完整搭建过程
|
7月前
|
定位技术
|
2天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
22 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
25天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0