HMS 地图工具包 - 在调用 getMapAsync() 后未调用 onMapReady()
HMS Map toolkit - onMapReady() not called after getMapAsync() calling
我正在使用 HMS 地图,为此我遵循他们的文档。
对于这个查询,我尝试了这个 。我也添加了 SHA-256 密钥和 agconnect-services.json 文件。
我做的步骤是:
应用中的依赖项 gradle:implementation 'com.huawei.hms:maps:6.0.0.301'
在应用中 gradle:apply plugin: 'com.huawei.agconnect'
我的根 gradle 是:
buildscript {
repositories {
maven { url 'http://developer.huawei.com/repo/' }
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.huawei.agconnect:agcp:1.2.1.301'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven {url 'http://developer.huawei.com/repo/'}
google()
jcenter()
mavenCentral()
maven {
url 'https://jitpack.io'
}
maven {
url "https://github.com/QuickBlox/quickblox-android-sdk-releases/raw/master/"
}
}
}
我在 AppGallery 连接中添加了 SHA-256 密钥。
从 AppGallery 连接启用 MapApi。
在我的项目中下载并添加了 "agconnect-services.json" 文件。
在解决了一些与线程相关的问题后,我能够产生 logcat 错误,它说 "Illegal FingerPrint".
我知道,这是关于 AppGallery 的一些集成问题,但我无法理解我所缺少的,我正在执行所有步骤。
**Logcat 是:**
2021-08-31 10:35:22.520 30490-30773/com.moody.poster E/HmsMapKit_AuthenticateClient_1074: Exception occur
com.huawei.hms.maps.foundation.client.d: *1*0*2*:*I*L*G*L*F*N*E*P*I*T
at com.huawei.hms.maps.foundation.client.d$d.c(:89)
at com.huawei.hms.maps.foundation.client.c.d(:22556)
at com.huawei.hms.maps.foundation.client.c.c(:88)
at com.huawei.hms.maps.maproute.client.auth.e.d(:76)
at com.huawei.hms.maps.maproute.client.auth.e.a(Unknown Source:0)
at com.huawei.hms.maps.maproute.client.auth.b.a(Unknown Source:4)
at com.huawei.hms.maps.foundation.client.c$a.e(:492)
at com.huawei.hms.maps.maproute.client.auth.e.c(:1074)
at com.huawei.hms.maps.maproute.cache.c$b.e(:298)
at com.huawei.hms.maps.maproute.cache.c$b.call(:291)
at eU.a(:42)
at em.d(:12025)
at fc$b.run(:96)
at eq$c.run(:571)
at fj.run(:66)
at fj.call(:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:929)
2021-08-31 10:35:22.528 30490-30773/com.moody.poster E/HmsMapKit_ErrorTraceLogPusher_509: cache error trace log : ErrorTraceLogDTO{ scenario = ACCESS_SERVICE_ERROR', message='010002 : ILLEGAL_FINGERPRINT'}
com.huawei.hms.maps.foundation.client.d: *1*0*2*:*I*L*G*L*F*N*E*P*I*T
at com.huawei.hms.maps.foundation.client.d$d.c(:89)
at com.huawei.hms.maps.foundation.client.c.d(:22556)
at com.huawei.hms.maps.foundation.client.c.c(:88)
at com.huawei.hms.maps.maproute.client.auth.e.d(:76)
at com.huawei.hms.maps.maproute.client.auth.e.a(Unknown Source:0)
at com.huawei.hms.maps.maproute.client.auth.b.a(Unknown Source:4)
at com.huawei.hms.maps.foundation.client.c$a.e(:492)
at com.huawei.hms.maps.maproute.client.auth.e.c(:1074)
at com.huawei.hms.maps.maproute.cache.c$b.e(:298)
at com.huawei.hms.maps.maproute.cache.c$b.call(:291)
at eU.a(:42)
at em.d(:12025)
at fc$b.run(:96)
at eq$c.run(:571)
at fj.run(:66)
at fj.call(:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:929)
2021-08-31 10:35:22.536 30490-30773/com.moody.poster E/HmsMapKit_AuthenticateCache_333: other err occur,errorCode : .010002 : ILLEGAL_FINGERPRINT
2021-08-31 10:35:22.775 30490-30490/com.moody.poster E/HmsMapKit_AccessTraceLogPusher_16: analyticsInstance is null
2021-08-31 10:35:22.778 30490-30490/com.moody.poster E/HmsMapKit_UserEventLogPusher_16: analyticsInstance is null
我在做HMS Map的时候遇到过类似的问题。在我的例子中,我在一个片段上有地图并且正在使用 activity 文档。要修复它,我必须使用 SupportMapFragment,之后一切正常。
更新
在您的以下日志中:
2021-08-31 10:35:22.528 30490-30773/com.moody.poster E/HmsMapKit_ErrorTraceLogPusher_509: cache error trace log : ErrorTraceLogDTO{ scenario = ACCESS_SERVICE_ERROR', message='010002 : ILLEGAL_FINGERPRINT'}
如Docs所述,可能的原因如下:
您项目中的应用ID与AppGallery Connect中的不同
未配置签名证书指纹。您需要生成签名证书指纹并在AppGallery Connect中配置。
您的应用的AppGallery Connect配置文件未配置。您需要按照 Adding the AppGallery Connect Configuration File of Your App 中的说明进行配置。
API 密钥未使用 encode.
进行转码
也可以按照这个文档:Generating a Signing Certificate Fingerprint,看看有没有问题。
以下Map kit codelab供大家参考。你可以按照这个看看它是否有效。
1.Declare 与AndroidManifest.xml 文件中的应用程序块同级别的块中的相关权限。
<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.Add 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.Add调用MapView到activity文件的配置。文件路径为\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.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);
// Obtain a 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 the API key in
// agconnect-services.json.
MapsInitializer.setApiKey("Your API key");
mMapView.onCreate(mapViewBundle);
// Obtain a map instance.
mMapView.getMapAsync(this);
}
@Override
public void onMapReady(HuaweiMap map) {
// Obtain a map instance from callback.
Log.d(TAG, "onMapReady: ");
hMap = map;
}
}
4.Add MapView 的生命周期方法。文件路径为\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.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();
}
5.Verify 已分配所需的权限。文件路径为\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.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;
}
我不确定为什么会这样,我就这个问题与华为开发人员进行了交谈,我是在一个片段中这样做的,但是当我在 activity 中尝试这个时,它完美地工作。现在我在一个单独的 Activity 中进行。 (我使用 HMS 工具包的内置方法创建了 activity。)
我正在使用 HMS 地图,为此我遵循他们的文档。
对于这个查询,我尝试了这个
我做的步骤是:
应用中的依赖项 gradle:implementation 'com.huawei.hms:maps:6.0.0.301'
在应用中 gradle:apply plugin: 'com.huawei.agconnect'
我的根 gradle 是:
buildscript {
repositories {
maven { url 'http://developer.huawei.com/repo/' }
google()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.huawei.agconnect:agcp:1.2.1.301'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven {url 'http://developer.huawei.com/repo/'}
google()
jcenter()
mavenCentral()
maven {
url 'https://jitpack.io'
}
maven {
url "https://github.com/QuickBlox/quickblox-android-sdk-releases/raw/master/"
}
}
}
我在 AppGallery 连接中添加了 SHA-256 密钥。
从 AppGallery 连接启用 MapApi。
在我的项目中下载并添加了 "agconnect-services.json" 文件。
在解决了一些与线程相关的问题后,我能够产生 logcat 错误,它说 "Illegal FingerPrint".
我知道,这是关于 AppGallery 的一些集成问题,但我无法理解我所缺少的,我正在执行所有步骤。
**Logcat 是:**
2021-08-31 10:35:22.520 30490-30773/com.moody.poster E/HmsMapKit_AuthenticateClient_1074: Exception occur
com.huawei.hms.maps.foundation.client.d: *1*0*2*:*I*L*G*L*F*N*E*P*I*T
at com.huawei.hms.maps.foundation.client.d$d.c(:89)
at com.huawei.hms.maps.foundation.client.c.d(:22556)
at com.huawei.hms.maps.foundation.client.c.c(:88)
at com.huawei.hms.maps.maproute.client.auth.e.d(:76)
at com.huawei.hms.maps.maproute.client.auth.e.a(Unknown Source:0)
at com.huawei.hms.maps.maproute.client.auth.b.a(Unknown Source:4)
at com.huawei.hms.maps.foundation.client.c$a.e(:492)
at com.huawei.hms.maps.maproute.client.auth.e.c(:1074)
at com.huawei.hms.maps.maproute.cache.c$b.e(:298)
at com.huawei.hms.maps.maproute.cache.c$b.call(:291)
at eU.a(:42)
at em.d(:12025)
at fc$b.run(:96)
at eq$c.run(:571)
at fj.run(:66)
at fj.call(:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:929)
2021-08-31 10:35:22.528 30490-30773/com.moody.poster E/HmsMapKit_ErrorTraceLogPusher_509: cache error trace log : ErrorTraceLogDTO{ scenario = ACCESS_SERVICE_ERROR', message='010002 : ILLEGAL_FINGERPRINT'}
com.huawei.hms.maps.foundation.client.d: *1*0*2*:*I*L*G*L*F*N*E*P*I*T
at com.huawei.hms.maps.foundation.client.d$d.c(:89)
at com.huawei.hms.maps.foundation.client.c.d(:22556)
at com.huawei.hms.maps.foundation.client.c.c(:88)
at com.huawei.hms.maps.maproute.client.auth.e.d(:76)
at com.huawei.hms.maps.maproute.client.auth.e.a(Unknown Source:0)
at com.huawei.hms.maps.maproute.client.auth.b.a(Unknown Source:4)
at com.huawei.hms.maps.foundation.client.c$a.e(:492)
at com.huawei.hms.maps.maproute.client.auth.e.c(:1074)
at com.huawei.hms.maps.maproute.cache.c$b.e(:298)
at com.huawei.hms.maps.maproute.cache.c$b.call(:291)
at eU.a(:42)
at em.d(:12025)
at fc$b.run(:96)
at eq$c.run(:571)
at fj.run(:66)
at fj.call(:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:929)
2021-08-31 10:35:22.536 30490-30773/com.moody.poster E/HmsMapKit_AuthenticateCache_333: other err occur,errorCode : .010002 : ILLEGAL_FINGERPRINT
2021-08-31 10:35:22.775 30490-30490/com.moody.poster E/HmsMapKit_AccessTraceLogPusher_16: analyticsInstance is null
2021-08-31 10:35:22.778 30490-30490/com.moody.poster E/HmsMapKit_UserEventLogPusher_16: analyticsInstance is null
我在做HMS Map的时候遇到过类似的问题。在我的例子中,我在一个片段上有地图并且正在使用 activity 文档。要修复它,我必须使用 SupportMapFragment,之后一切正常。
更新
在您的以下日志中:
2021-08-31 10:35:22.528 30490-30773/com.moody.poster E/HmsMapKit_ErrorTraceLogPusher_509: cache error trace log : ErrorTraceLogDTO{ scenario = ACCESS_SERVICE_ERROR', message='010002 : ILLEGAL_FINGERPRINT'}
如Docs所述,可能的原因如下:
您项目中的应用ID与AppGallery Connect中的不同
未配置签名证书指纹。您需要生成签名证书指纹并在AppGallery Connect中配置。
您的应用的AppGallery Connect配置文件未配置。您需要按照 Adding the AppGallery Connect Configuration File of Your App 中的说明进行配置。
API 密钥未使用 encode.
进行转码
也可以按照这个文档:Generating a Signing Certificate Fingerprint,看看有没有问题。
以下Map kit codelab供大家参考。你可以按照这个看看它是否有效。
1.Declare 与AndroidManifest.xml 文件中的应用程序块同级别的块中的相关权限。
<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.Add 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.Add调用MapView到activity文件的配置。文件路径为\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.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);
// Obtain a 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 the API key in
// agconnect-services.json.
MapsInitializer.setApiKey("Your API key");
mMapView.onCreate(mapViewBundle);
// Obtain a map instance.
mMapView.getMapAsync(this);
}
@Override
public void onMapReady(HuaweiMap map) {
// Obtain a map instance from callback.
Log.d(TAG, "onMapReady: ");
hMap = map;
}
}
4.Add MapView 的生命周期方法。文件路径为\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.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();
}
5.Verify 已分配所需的权限。文件路径为\mapdemo\app\src\main\java\com\wz\android\mapdemo\MainActivity.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;
}
我不确定为什么会这样,我就这个问题与华为开发人员进行了交谈,我是在一个片段中这样做的,但是当我在 activity 中尝试这个时,它完美地工作。现在我在一个单独的 Activity 中进行。 (我使用 HMS 工具包的内置方法创建了 activity。)