1. 介绍
简介
地图Android SDK是一套Android系统地图开发调用的接口,地图数据可以覆盖海外绝大多数国家,支持多种语言。地图采用WGS84 GPS坐标系,满足绝大多数海外地图开发的需求。您可以轻松地在自己的Android应用中加入地图相关的功能,包括:
- 地图呈现:包括建筑,道路,水系,兴趣点等。
- 地图交互:控制地图的交互手势和交互按钮。
- 地图绘制:添加位置标记,覆盖物以及各种形状等。
您将建立什么
您可通过地图服务SDK可以开发地图相关的App,比如:
- 运动健康类App:通过地图服务SDK可以显示地图,用户定位和路径计算等功能。
- 社交类App:通过地图服务SDK可以分享自己的位置。
- 基本地图App:过当前指导,可以建立一个展示基本地图的App。
您将会学到什么
- 如何在华为开发者联盟上创建应用以及配置应用的相关信息。
- 如何从华为开发者联盟的Map服务开发者文档获取地图Demo代码。
- 如何使用Android Studio集成地图服务SDK进行地图功能开发。
- 如何构建地图样例并展示。
3. 能力接入准备
集成Map Kit能力,您需要完成以下准备工作:
- 创建AppGallery Connect(以下简称AGC)应用
- 添加应用包名
- 创建Android Studio工程
- 生成签名证书
- 生成签名证书指纹
- 配置签名证书指纹
- 配置Maven仓地址及AGC gradle插件
- 在Android Studio配置签名文件
4. 开通地图服务
1. - 登录AppGallery Connect网站,选择"我的项目"。
2. - 在项目列表中找到您的项目,在项目下的应用列表中选择需要开通地图服务的应用。
3. - 前往"项目设置 > API管理"中开启"地图服务"权限。
5. 设置您的环境
添加应用的AppGallery Connect配置文件。
- 下载应用中的"agconnect-services.json"配置文件。

- 将"agconnect-services.json"配置在模块级目录下。

添加编译依赖
- 打开应用级的"build.gradle"文件。

- 在"dependencies"中添加如下编译依赖。
dependencies { implementation 'com.huawei.hms:maps:{version}' } - 在文件头添加配置apply plugin: 'com.huawei.agconnect'。

6. 地图功能开发
- 在"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"/> - 在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> - 在活动中添加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 } } - 调用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() } - 确认是否已开启所需权限。文件位置为"\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. 参考
- 造成返回码010001或010002可能的原因?
- 项目中App ID与AppGallery Connect上不一致。
- 未配置指纹。需在本地生成签名证书指纹,然后在AppGallery Connect中配置。
- 未配置应用的AppGallery Connect配置文件,请参见添加当前应用的AppGallery Connect配置文件。
- API Key没有使用encodeURI转码。
- 更多关于地图服务的功能请参见地图服务指南文档。
- 您可以点击下载源码。
剩余