剩余95分钟读完

地图服务(Android)

剩余95分钟读完
Read mode

1. 介绍

简介

地图Android SDK是一套Android系统地图开发调用的接口,地图数据可以覆盖海外绝大多数国家,支持多种语言。地图采用WGS84 GPS坐标系,满足绝大多数海外地图开发的需求。您可以轻松地在自己的Android应用中加入地图相关的功能,包括:

  • 地图呈现:包括建筑,道路,水系,兴趣点等。
  • 地图交互:控制地图的交互手势和交互按钮。
  • 地图绘制:添加位置标记,覆盖物以及各种形状等。

您将建立什么

您可通过地图服务SDK可以开发地图相关的App,比如:

  • 运动健康类App:通过地图服务SDK可以显示地图,用户定位和路径计算等功能。
  • 社交类App:通过地图服务SDK可以分享自己的位置。
  • 基本地图App:过当前指导,可以建立一个展示基本地图的App。

您将会学到什么

  • 如何在华为开发者联盟上创建应用以及配置应用的相关信息。
  • 如何从华为开发者联盟的Map服务开发者文档获取地图Demo代码。
  • 如何使用Android Studio集成地图服务SDK进行地图功能开发。
  • 如何构建地图样例并展示。

2. 您需要什么

硬件要求

  • 计算机(台式机或笔记本电脑),使用Windows操作系统。
  • EMUI 5.0及以上的华为手机、平板或Android 7.0 ~ 12的非华为手机。

软件要求

3. 能力接入准备

集成Map Kit能力,您需要完成以下准备工作:

  • 创建AppGallery Connect(以下简称AGC)应用
  • 添加应用包名
  • 创建Android Studio工程
  • 生成签名证书
  • 生成签名证书指纹
  • 配置签名证书指纹
  • 配置Maven仓地址及AGC gradle插件
  • 在Android Studio配置签名文件
具体操作,请按照HUAWEI HMS Core集成准备中详细说明来完成。

4. 开通地图服务

1. - 登录AppGallery Connect网站,选择"我的项目"。
2. - 在项目列表中找到您的项目,在项目下的应用列表中选择需要开通地图服务的应用。
3. - 前往"项目设置 > API管理"中开启"地图服务"权限。

5. 设置您的环境

添加应用的AppGallery Connect配置文件。

  1. 下载应用中的"agconnect-services.json"配置文件。
  2. 将"agconnect-services.json"配置在模块级目录下。

添加编译依赖

  1. 打开应用级的"build.gradle"文件。
  2. 在"dependencies"中添加如下编译依赖。
    dependencies { implementation 'com.huawei.hms:maps:{version}' }
  3. 在文件头添加配置apply plugin: 'com.huawei.agconnect'

6. 地图功能开发

  1. 在"AndroidManifest.xml"中"application"同级标签添加权限申请。
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  2. 在layout中添加MapView 。文件位置为"\mapdemo\app\src\main\res\layout\activity_main.xml"。
    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.huawei.hms.maps.MapView xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" map:cameraTargetLat="51" map:cameraTargetLng="10" map:cameraZoom="8.5" map:mapType="normal" map:uiCompass="true" map:uiZoomControls="true" /> </LinearLayout>
  3. 在活动中添加MapView的调用。文件位置为"\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.java"。
    Java示例代码如下:
    package com.wz.android.mapdemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.huawei.hms.maps.HuaweiMap; import com.huawei.hms.maps.MapView; import com.huawei.hms.maps.OnMapReadyCallback; /** * map activity entrance class */ public class MainActivity extends AppCompatActivity implements OnMapReadyCallback { private static final String TAG = "MapViewDemoActivity"; // HUAWEI map private HuaweiMap hMap; private MapView mMapView; private static final String MAPVIEW_BUNDLE_KEY = "MapViewBundleKey"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // get mapview instance mMapView = findViewById(R.id.mapView); Bundle mapViewBundle = null; if (savedInstanceState != null) { mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY); } // please replace "Your API key" with api_key field value in // agconnect-services.json MapsInitializer.setApiKey("Your API key"); mMapView.onCreate(mapViewBundle); // get map instance mMapView.getMapAsync(this); } @Override public void onMapReady(HuaweiMap map) { // get map instance in a callback method Log.d(TAG, "onMapReady: "); hMap = map; } }

    Kotlin示例代码如下:

    package com.huawei.mapkitsample import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.huawei.hms.maps.CameraUpdateFactory import com.huawei.hms.maps.HuaweiMap import com.huawei.hms.maps.MapView import com.huawei.hms.maps.OnMapReadyCallback import com.huawei.hms.maps.model.LatLng import com.huawei.hms.maps.util.LogM /** * map activity entrance class */ class MapViewDemoActivity : AppCompatActivity(), OnMapReadyCallback { // HUAWEI map private var hMap: HuaweiMap? = null private var mMapView: MapView? = null companion object { private const val TAG = "MapViewDemoActivity" private const val MAPVIEW_BUNDLE_KEY = "MapViewBundleKey" } override fun onCreate(savedInstanceState: Bundle?) { LogM.d(TAG, "onCreate:") super.onCreate(savedInstanceState) setContentView(R.layout.activity_mapview_demo) mMapView = findViewById(R.id.mapView) var mapViewBundle: Bundle? = null if (savedInstanceState != null) { mapViewBundle = savedInstanceState.getBundle(MAPVIEW_BUNDLE_KEY) } mMapView?.apply { onCreate(mapViewBundle) getMapAsync(this@MapViewDemoActivity) } } override fun onMapReady(map: HuaweiMap) { Log.d(TAG, "onMapReady: ") hMap = map } }
  4. 调用MapView的生命周期。文件位置为"\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.java"。
    Java示例代码如下:
    @Override protected void onStart() { super.onStart(); mMapView.onStart(); } @Override protected void onStop() { super.onStop(); mMapView.onStop(); } @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override protected void onPause() { mMapView.onPause(); super.onPause(); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); }

    Kotlin示例代码如下:

    override fun onStart() { super.onStart() mMapView?.onStart() } override fun onStop() { super.onStop() mMapView?.onStop() } override fun onDestroy() { super.onDestroy() mMapView?.onDestroy() } override fun onPause() { mMapView?.onPause() super.onPause() } override fun onResume() { super.onResume() mMapView?.onResume() }
  5. 确认是否已开启所需权限。文件位置为"\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.java"。
    Java示例代码如下:
    private static boolean hasPermissions(Context context, String... permissions) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) { for (String permission : permissions) { if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } } return true; }

    Kotlin示例代码如下:

    private fun hasPermissions(context: Context, vararg permissions: String): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { for (permission in permissions) { if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false } } } return true }

编译、加载、调试

使用Android Studio自带的Gradle编译工具,双击"installDebug",即可安装Demo。

7. 产品联调和测试

打开开发调试版本的地图Demo后,查看地图是否能够展示。

8. 恭喜您

干得好,您已经成功完成了codelab并学到了:

  • 如何在开发者联盟中配置地图相关App
  • 如何从开发者联盟的Map服务开发者文档获取地图Demo代码
  • 如何使用Android Studio集成Map SDK进行地图功能开发
  • 如何构建地图并展示

9. 参考

  1. 造成返回码010001或010002可能的原因?更多错误码解析请参见错误码
  2. 更多关于地图服务的功能请参见地图服务指南文档
  3. 您可以点击下载源码
Code copied