美文网首页
android 集成腾讯地图定位

android 集成腾讯地图定位

作者: Code819 | 来源:发表于2021-01-06 15:32 被阅读0次

    本文只教学定位功能,需要搜索、2D或3D地图的可以到腾讯地图开发平台看api文档,链接:[腾讯地图](https://lbs.qq.com/)

    一、到腾讯地图开发平下载定位sdk,快速入口:[腾讯地图定位](https://lbs.qq.com/mobile/androidLocationSDK/androidGeoDownload)

    二、在项目的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)

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200616111353317.PNG)

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200616111037775.PNG)

    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);

        }

    }

    相关文章

      网友评论

          本文标题:android 集成腾讯地图定位

          本文链接:https://www.haomeiwen.com/subject/vkrooktx.html