Android 腾讯地图定位

2022-06-10 13:44:13 浏览数 (1)

1,申请key

https://lbs.qq.com/console/key.html

2,配置环境

a,配置sdk

下载jar包 TencentLocationSdk_v7.1.5 (点击链接可直接下载)

解压得到以下路径:

我们要用到的是libs目录下的so包 和 sdk jar

很简单,sdk jar包拷到项目中的libs目录下,并 选中 > 右键 > Add As Library,没有libs目录就新建,与src目录同级。

so包拷到jniLibs 目录下,没有jniLibs 目录就新建,在main目录下,与java目录同级。

b,配置 manifest

添加权限:

代码语言:javascript复制
<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 访问网络,某些位置信息需要从网络服务器获取 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 访问WiFi状态,需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 修改WiFi状态,发起WiFi扫描, 需要WiFi信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 访问网络状态, 检测网络的可用性,需要网络运营商相关信息用于网络定位 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 访问网络的变化, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 访问手机当前状态, 需要某些信息用于网络定位 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

加过的就不用重复再加

配置key:

代码语言:javascript复制
<application>
    ...
    <meta-data android:name="TencentMapSDK" android:value="您申请的Key" />
</application>

混淆(用就加,不用就不加,不知道就不加):

代码语言:javascript复制
-keepclassmembers class ** {
    public void on*Event(...);
}
-keep class c.t.**{*;}
-keep class com.tencent.map.geolocation.**{*;}
-keep class com.tencent.tencentmap.lbssdk.service.**{*;}
 
 
-dontwarn  org.eclipse.jdt.annotation.**
-dontwarn  c.t.**

3,开始定位

a,建议先获取位置权限,之前已获取的可以跳过
代码语言:javascript复制
RxPermissions rxPermission = new RxPermissions(AddressLocationActivity.this);
        rxPermission.requestEach(Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                        // 已经同意该权限
                            initTencentLocationRequest();
                        } else {
                        // 拒绝了该权限
                        }
                    }
                });
b,创建监听
代码语言:javascript复制
    /**
     * 开启定位监听器
     */
    private void initTencentLocationRequest() {
        TencentLocationRequest request = TencentLocationRequest.create();
        request.setInterval(30000).setRequestLevel(1).setAllowCache(true);
        TencentLocationManager locationManager = TencentLocationManager.getInstance(this);
        int error = locationManager.requestLocationUpdates(request, this);
        if (error == 0)
            LogUtil.i("注册位置监听器成功!");
        else
            LogUtil.i("注册位置监听器失败!");
    }

Activity 实现TencentLocationListener 接口并 实现两个方法 onLocationChangedonStatusUpdate,前者是位置更新时的回调,后者是GPS和Wi-Fi的状态变化回调。

c,定位回调
代码语言:javascript复制
    /**
     * 位置更新时的回调
     *
     * @param tencentLocation 新的位置
     * @param i               错误码
     * @param s               错误描述
     */
    @Override
    public void onLocationChanged(TencentLocation tencentLocation, int i, String s) {
        if (TencentLocation.ERROR_OK == i) {
            // 定位成功
            if (tencentLocation != null) {
                String lat = String.valueOf(tencentLocation.getLatitude());
                String lon = String.valueOf(tencentLocation.getLongitude());
                LogUtil.i(lat   "---"   lon);
            }
        } else {
            // 定位失败
        }
    }

定位成功之后,我们可以在TencentLocation 对象中获取我们需要的信息,而TencentLocation 中信息的有效性是根据setRequestLevel 等级确定的

ok,到这里就完成基本定位了,但是也要做好善后工作。

d,删除位置监听器
代码语言:javascript复制
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //删除位置监听器
        TencentLocationManager locationManager = TencentLocationManager.getInstance(this);
        locationManager.removeUpdates(this);
    }

ok 基本功能完成, 更多 查看官方文档

0 人点赞