Xamarin.Android 无法解析来自第 3 方库的服务
Xamarin.Android can't resolve service from a 3rd party library
我正在尝试将 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
。在我的地图 activity 中,我添加了地图设置初始化:
var path = GetExternalFilesDir(null) + File.Separator + ".map_cache";
var success = MapSettings.SetIsolatedDiskCacheRootPath(path, "com.my.app.MapsAction"); // returns true
然后我像这样在地图片段上调用初始化:
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
我认为服务声明中可能存在一些错误,或者我在我的清单中尝试声明第 3 方服务时遗漏了一两步。有什么建议吗?
谢谢。
通常情况下,问题出在椅子和键盘之间。
当我向清单添加 service
元素时,我实际上是在 manifest
元素中添加了一个 service
元素。这是不正确的,您的 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,让我三重检查我的清单。
我正在尝试将 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
。在我的地图 activity 中,我添加了地图设置初始化:
var path = GetExternalFilesDir(null) + File.Separator + ".map_cache";
var success = MapSettings.SetIsolatedDiskCacheRootPath(path, "com.my.app.MapsAction"); // returns true
然后我像这样在地图片段上调用初始化:
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
我认为服务声明中可能存在一些错误,或者我在我的清单中尝试声明第 3 方服务时遗漏了一两步。有什么建议吗?
谢谢。
通常情况下,问题出在椅子和键盘之间。
当我向清单添加 service
元素时,我实际上是在 manifest
元素中添加了一个 service
元素。这是不正确的,您的 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,让我三重检查我的清单。