Android 集成腾讯地图定位

本文只教学定位功能,需要搜索、2D或3D地图的可以到腾讯地图开发平台看api文档,链接:腾讯地图

一、到腾讯地图开发平下载定位sdk,快速入口:腾讯地图定位

二、在项目的AndroidManiFest文件加入权限和配置AppKey

<!-- 通过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" />
<!-- 访问手机当前状态, 需要device id用于网络定位 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 支持A-GPS辅助定位 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<!-- 用于 log 日志 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application>
    <meta-data android:name="TencentMapSDK" android:value="您申请的Key" />
</application>

三、Android Studio配置工程 Android Studio的配置方式有两种:
方法1:
a)在libs主动添加so文件和SDK(如果项目有聊天或其他的so文件冲突的话,可以把他们放在一起,我也是这样,目前来看没什么bug)
在这里插入图片描述
在这里插入图片描述
b)在 build.gradle 文件的 dependencies 中配置

  implementation fileTree(include: ['*.jar'], dir: 'libs')
  //腾讯地图定位
  implementation files('libs/TencentLocationSdk_v7.2.6.jar')

方法二:
Gradle配置引用
a)修改根目录gradle配置

llprojects {
    repositories {
        jcenter()
        google()
        mavenCentral()
    }
}

b)修改工程目录gradle配置
在 build.gradle 文件的 dependencies 中增加配置

implementation 'com.tencent.map.geolocation:TencentLocationSdk-openplatform:7.2.6'

四、代码混淆
在proguard-rules.pro文件加入代码混淆(复制粘贴即可)

-keepclassmembers class ** {
    public void on*Event(...);
}

-keep class c.t.**{*;}
-keep class com.tencent.map.geolocation.**{*;}

-dontwarn  org.eclipse.jdt.annotation.**
-dontwarn  c.t.**

五、接下就是代码了

public class LocationActivity extends BaseActivity implements TencentLocationListener {
    private static final int MY_PERMISSION_REQUEST_CODE = 10000;
    private TencentLocationRequest request;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        initdata();
    }

    public void initdata() {
        checkPermission();
    }
    public void setLocation() {
        request = TencentLocationRequest.create();
        request.setInterval(60000);//设置定位周期(位置监听器回调周期), 单位为 ms (毫秒)
        request.setRequestLevel(REQUEST_LEVEL_POI); // 0:包含经纬度,1:包含经纬度, 位置名称, 位置地址,3:包含经纬度,位置所处的中国大陆行政区划,4:包含经纬度,位置所处的中国大陆行政区划及周边POI列表
        request.setAllowGPS(true);
        request.setAllowDirection(true);
        request.setIndoorLocationMode(true);

        TencentLocationListener listener = this;
        TencentLocationManager locationManager = TencentLocationManager.getInstance(LocationActivity.this);
        int error = locationManager.requestLocationUpdates(request, listener);
        if (error == 0) {
            //注册位置监听器成功
        } else {
            //注册位置监听器失败keytool -v -list -keystore
            locationNowlocation.setText("定位失败");
        }
    }

    @Override
    public void onLocationChanged(TencentLocation tencentLocation, int error, String s) {
        if (TencentLocation.ERROR_OK == error) { // 定位成功
            //定位成功
            if (tencentLocation != null) {
                String address = tencentLocation.getCity();
                locationNowlocation.setText(address);
            }
        } else { // 定位失败
            Tools.ToastTextThread(LocationActivity.this, "定位失败");
        }
    }

    @Override
    public void onStatusUpdate(String name, int status, String desc) {
        /*if (name.equals("GPS")) {
            if (status == 0) {
                Tools.ToastTextThread(LocationActivity.this, "GPS关闭");
            }
        }*/
    }

    public void checkPermission() {
        //检查是否有相应的权限,根据自己需求,进行添加相应的权限
        boolean isAllGranted = checkPermissionAllGranted(
                new String[]{
                        Manifest.permission.ACCESS_COARSE_LOCATION
                }
        );
        // 如果这3个权限全都拥有, 则直接执行备份代码
        if (isAllGranted) {
            setLocation();
        } else {
            // 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSION_REQUEST_CODE);
        }
    }

    /**
     * 检查是否拥有指定的所有权限
     */
    private boolean checkPermissionAllGranted(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                // 只要有一个权限没有被授予, 则直接返回 false
                return false;
            }
        }
        return true;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == MY_PERMISSION_REQUEST_CODE) {
            boolean isAllGranted = true;
            // 判断是否所有的权限都已经授予了
            for (int grant : grantResults) {
                if (grant != PackageManager.PERMISSION_GRANTED) {
                    isAllGranted = false;
                    break;
                }
            }

            if (isAllGranted) {
                // 所有的权限都授予
                setLocation();
            } else {
                // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
                setLocationDialog("");
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //关闭定位监听器
        TencentLocationManager locationManager = TencentLocationManager.getInstance(this);
        locationManager.removeUpdates(this);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43290998/article/details/106782971
今日推荐