Android 集成腾讯定位:支持获取WGS-84坐标

在安卓软件开发过程中需要用到定位,在对比了国内比较知名的三种:

1.高德定位

2.百度定位

3.腾讯定位

今天主要介绍的是第三种腾讯定位,原因主要是:

支持获取WGS-84坐标。下面介绍一下接触到的坐标系统。

1.地球坐标 (WGS84)

国际标准,从专业GPS 设备中取出的数据的坐标系

国际地图提供商使用的坐标系

2.火星坐标 (GCJ-02)也叫国测局坐标系

中国标准,从国行移动设备中定位获取的坐标数据使用这个坐标系

国家规定: 国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。

3.百度坐标 (BD-09)

百度标准,百度 SDK,百度地图,Geocoding 使用

(本来就乱了,百度又在火星坐标上来个二次加密)

总结一下 

如果使用的是百度sdk那么可以获得百度坐标(bd09)或者火星坐标(GCJ02),默认是bd09

如果使用的是ios的原生定位库,那么获得的坐标是WGS84

如果使用的是高德sdk,那么获取的坐标是GCJ02

链接:Android定位SDK的安装和使用

下面记录以下主要流程和可能出现问题的方法:

第一步、导入库文件

找到开发包中的 libtencentloc.zip文件夹,拷贝相应目录下的so文件到目标工程中的 libs目录下。

jar包导入

找到开发包中的 TencentLocationSDK_v4.3.0_r196568.jar 文件,拷贝到目标工程中的 libs 目录下。

注意: 如果 TencentLocationSDK_v4.3.0_r196568.jar没有自动加入到工程的 build path 中,则需要手动添加。手动添加的步骤如下:右击工程,在 工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定 TencentLocationSDK_v4.3.0_r196568.jar,确定后返回。这样您就可以在程序中使用腾讯地图定位SDK了。

so文件导入

讲需要的so文件导入,详细介绍如下

方法一:

将so文件导入如下的目录(若没有则新建)

方法二:

在build.gradle中加入如下代码:


android {

    ......

    sourceSets {

        main {

            jniLibs.srcDir 'libs' //设置so文件位置

        }

    }

}


之后讲so文件放入如下目录

第二步、配置 manifest及权限

权限声明


在 AndroidManifest.xml 中添加使用权限:


动态申请权限


if (Build.VERSION.SDK_INT >= 23) {

    String[] permissions = {

                Manifest.permission.ACCESS_COARSE_LOCATION,

                Manifest.permission.READ_PHONE_STATE,

                Manifest.permission.WRITE_EXTERNAL_STORAGE

        };

    if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED)

    {

        requestPermissions(permissions, 0);

    }

}


配置key

在 AndroidManifest.xml 中配置Key


    ...

   


第三步、创建位置监听器

TencentLocationListener 接口代表位置监听器,您的APP 通过位置监听器接收定位SDK的位置变化通知。创建位置监听器非常简单,通常您只需实现 TencentLocationListener 接口。如下所示:


public class MyActivity extends Activity implements TencentLocationListener {

    ...

    @Override

    public void onLocationChanged(TencentLocation location, int error, String reason) {

        // do your work

    }

    @Override

    public void onStatusUpdate(String name, int status, String desc) {

        // do your work

    }         

}


第四步、创建定位请求

TencentLocationRequest 类代表定位请求, 您的APP通过向定位SDK发送定位请求来启动定位。通常您只需获取 TencentLocationRequest 实例即可,如下所示:


TencentLocationRequest request = TencentLocationRequest.create()


第五步、注册位置监视器


mLocationManager = TencentLocationManager.getInstance(this);

        /* 保证调整坐标系前已停止定位 */

        mLocationManager.removeUpdates(null);

        // 设置 wgs84 坐标系

        mLocationManager

                .setCoordinateType(TencentLocationManager.COORDINATE_TYPE_WGS84);


第六步、开始定位并获取定位结果

开始定位


private void start(){

        // 创建定位请求

        TencentLocationRequest request = TencentLocationRequest.create();

        // 修改定位请求参数, 定位周期 3000 ms

        request.setInterval(3000);

        // 开始定位

        mLocationManager.requestLocationUpdates(request, this);

    }


注:在这一步可能会出现错误导致后面定位失败,开始定位的方法会返回一个特征码,标示定位监视器是否成功注册。

int error = locationManager.requestLocationUpdates(request, listener);

因此最好获取一下这个特征码,下表展示标识码含义: 返回值 | 含义 :– | :– 0 | 注册位置监听器成功 1 | 设备缺少使用腾讯定位SDK需要的基本条件 2 | 配置的 key 不正确 3 | 自动加载libtencentloc.so失败,可能由以下原因造成:

返回码3可能是以下原因造成: 1、这往往是由工程中的so与设备不兼容造成的,应该添加相应版本so文件; 2、如果您使用AndroidStudio,可能是gradle没有正确指向so文件加载位置,可以按照这里配置您的gradle;

作者:隔壁大虾 来源:CSDN 原文:https://blog.csdn.net/iamsamzhang/article/details/64129924 版权声明:本文为博主原创文章,转载请附上博文链接!

获取定位结果

在位置监视器接口中获取到定位结果。


@Override

    public void onLocationChanged(TencentLocation location, int i, String reason) {

        Log.i("MainActivity","位置改变回调!");

        String msg = null;

        if (i == TencentLocation.ERROR_OK) {

            // 定位成功

            StringBuilder sb = new StringBuilder();

            sb.append("(纬度=").append(location.getLatitude()).append(",经度=")

                    .append(location.getLongitude()).append(",精度=")

                    .append(location.getAccuracy()).append("), 来源=")

                    .append(location.getProvider()).append(", 地址=")

                    // 注意, 根据国家相关法规, wgs84坐标下无法提供地址信息

                    .append("{84坐标下不提供地址!}");

            msg = sb.toString();

        } else {

            // 定位失败

            msg = "定位失败: " + reason;

        }

        textView.setText(msg);

        Log.i("MainActivity",msg);

    }

    @Override

    public void onStatusUpdate(String s, int i, String s1) {

    }


第七步、删除位置监视器


Context context = ...

TencentLocationListener listener = ...

TencentLocationManager locationManager =

                        TencentLocationManager.getInstance(context);

locationManager.removeUpdates(listener);


运行结果:


你可能感兴趣的:(Android 集成腾讯定位:支持获取WGS-84坐标)