Android中天地图的使用解析

最近项目中需要使用天地图的项目。因为项目需求必须使用天地图来显示,这里对踩过的坑和开发做一个总结:

效果图如下:

1:首先注册天地图的账号,这个不用过多介绍。

2:找到个人界面,创建一个新应用,目的是获取天地图的key,从2019年1月1日开始需要用户注册才能获取key。

3:用户创建新应用的时候会让我们填入应用的SHAI值,我们打开Androidstudio找到我们任意一个有签名的项目,

    如果没有可以自己设置一个签名,然后输入如下命令,其中打码的是我本地应用的签名文件名,这里就不展示了:

然后输入密码,就是我们签名的密码,SHAI就出来了,然后填入需要申请的填入发布版SHA1和开发版SHA1就可以了。

4:地图key申请好了然后在相关下载----->移动API开发包(找到最新的)下载解压出来。

5:找到解压文件夹打开:如下标1的部分和标2的部分放到下面对应的文件夹下

放入Androidstudio的如下目录下的界面显示如下:

6:在AndroidManifest中添加如下权限:

<!-- 天地图所需权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

在Application节点下添加如下,其中value就是我们申请的key:

<meta-data
    android:name="com.tianditu.apikey"
    android:value="222be0ac5xxxxxxxxxxxxxxx0c58c0097" />

7:新建界面Java代码如下:

package com.example.andyyuan.apnapplication;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Point;
import android.location.Location;
import android.location.LocationListener;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.tianditu.android.maps.GeoPoint;
import com.tianditu.android.maps.MapController;
import com.tianditu.android.maps.MapView;
import com.tianditu.android.maps.MyLocationOverlay;
import com.tianditu.android.maps.overlay.MarkerOverlay;

import java.util.ArrayList;
import java.util.List;

public class OpenTiandituActivity extends AppCompatActivity {

    private MapView mMapView;
    private MyLocationOverlay myLocationOverlay;
    private GeoPoint mPoint;
    private List<String> permissionList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_open_tianditu);
        queryPermission();

        mMapView = (MapView) findViewById(R.id.open_tianditu_view);
        myLocationOverlay = new MyLocationOverlay(this, mMapView);
        initData();
    }

    private void queryPermission() {
        if (ContextCompat.checkSelfPermission(OpenTiandituActivity.this,
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(OpenTiandituActivity.this,
                Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (ContextCompat.checkSelfPermission(OpenTiandituActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if (!permissionList.isEmpty()) {
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(OpenTiandituActivity.this, permissions, 1);
        }
    }

    private void initData() {
        //设置启用内置的缩放控件
        //mMapView.setBuiltInZoomControls(true);
        //得到mMapView的控制权,可以用它控制和驱动平移和缩放
        MapController mMapController = mMapView.getController();
        //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6),之前的测试的一个地理位置显示
        //GeoPoint point = new GeoPoint((int) (31.127 * 1E6), (int) (121.531 * 1E6));
        //设置地图zoom级别
        mMapController.setZoom(16);

        //启用指南针位置更新
        myLocationOverlay.enableCompass();
        //启用我的位置
        myLocationOverlay.enableMyLocation();
        mMapView.addOverlay(myLocationOverlay);
        //获得当前位置
        mPoint = myLocationOverlay.getMyLocation();
        //        //设置地图中心点
        mMapController.setCenter(mPoint);
        //动画移动到当前位置
        mMapController.animateTo(mPoint);


    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0) {
                    for (int result : grantResults) {
                        if (result != PackageManager.PERMISSION_GRANTED) {
                            Toast.makeText(this, "必须同意所有权限才能使用", Toast.LENGTH_SHORT).show();
                            finish();
                            return;
                        }
                    }
                } else {
                    Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
                break;
        }
    }

    //地理位置变化的监听
    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            Toast.makeText(OpenTiandituActivity.this, "地理位置已经发生变化", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

        }
    };
}

8.布局文件中只有如下:

<com.tianditu.android.maps.MapView
    android:id="@+id/open_tianditu_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后点击运行,OK!

***************************************************发现了问题**********************************************************

在低版本的手机上倒是没有啥问题,在Android高于5.0版本上出现未知错误的闪退问题,最终定位解决了

只需要在targetSdkVersion 版本上改低一点,如19,就可以了

 

 

展开阅读全文

没有更多推荐了,返回首页