Xamarin.Android无法从第三方库解析服务

时间:2019-01-28 10:59:53

标签: xamarin xamarin.android here-api

我试图将HERE映射嵌入Xamarin应用程序中。为我提供了.aar库,该库已作为一个单独的项目绑定并在我的Android项目中引用。

根据documentation,我应该在我的应用程序中嵌入意图服务,以使地图正常工作。

所以我添加了

<service
  android:name="com.here.android.mpa.service.MapService"
  android:label="MAPSLABEL"
  android:exported="false">
  <intent-filter>
    <action android:name="com.my.app.MapsAction">
    </action>
  </intent-filter>
</service>

Properties/AndroidManifest.xml。在地图活动中,我添加了地图设置初始化:

var path = GetExternalFilesDir(null) + File.Separator + ".map_cache";
var success = MapSettings.SetIsolatedDiskCacheRootPath(path, "com.my.app.MapsAction"); // returns true

然后我在地图片段上这样调用init:

var f = (SupportMapFragment)SupportFragmentManager.FindFragmentById(Resource.Id.map_fragment);
f.Init(this);

在回调中,我收到MISSING_SERVICE错误:

com.nokia.maps.MapServiceClient$c: Map Service Not Found
at com.nokia.maps.MapServiceClient.a(MapServiceClient.java:72)
at com.nokia.maps.MapsEngine.a(MapsEngine.java:688)
at com.nokia.maps.MapsEngine.a(MapsEngine.java:393)
at com.here.android.mpa.common.MapEngine.init(MapEngine.java:198)
at com.nokia.maps.bw.a(MapFragmentImpl.java:150)
at com.here.android.mpa.mapping.SupportMapFragment.init(SupportMapFragment.java:112)
at md598e0954ab08e7442f21c9c8f5f40423e.MapActivity.n_onResume(Native Method)
at md598e0954ab08e7442f21c9c8f5f40423e.MapActivity.onResume(MapActivity.java:40)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1363)
at android.app.Activity.performResume(Activity.java:7440)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3780)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3845)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3065)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1724)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:7000)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

似乎我什至无法在代码中找到该服务:

var intent = new Intent("com.my.app.MapsAction");
var result = PackageManager.ResolveService(intent, PackageInfoFlags.Services); // returns null

我发现服务声明中可能存在一些错误,或者试图在清单中声明第三方服务时缺少了一两个步骤。有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,问题出在椅子和键盘之间。

当我在清单中添加service元素时,我实际上是在service元素中添加了manifest元素。这是不正确的,您的service应该在application下声明。因此,Properties/AndroidManifest.xml的正确版本看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="0.0.0.0" android:installLocation="auto" package="our_app_package">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <application android:label="our_app_label">
        <service android:name="com.here.android.mpa.service.MapService" android:label="service_label" android:exported="false">
            <intent-filter>
                <action android:name="service_action"></action>

            </intent-filter>
        </service>
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>

它已与其他application东西正确合并,并且该服务可以解析。

谢谢@Miiite,让我对清单进行了三遍检查。