首页 > 解决方案 > 针对 Android Pie 的 Xamarin Google Maps 应用程序坏了?

问题描述

为了尝试解决我正在尝试使用谷歌地图创建一个针对 Android Pie 的应用程序的问题,我决定启动一个非常小的项目来定位和隔离我可能遇到的问题,这就是我有...

  1. 创建一个针对 Android Pie 的新 Android 项目,将支持设计库 (Xamarin.Android.Support.Design) 更新为 28.0.0.1,因为默认情况下模板似乎将目标设置为 8.1。然后我添加了 nuget 包“Xamarin.GooglePlayServices.Maps”。这产生了一个关于依赖项未更新的警告(Xamarin.Android.Support.Media.Compat)并且仍然在 26.0.2。所以我在 28.0.0.1 手动更新它。

目标 Android SDK

  1. 创建一个名为 activity_main 的非常简单的布局

活动主

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment"
        android:layout_marginTop="24dp" />
</LinearLayout>

这只是一个包含单个谷歌地图片段的线性布局

  1. 创建活动类(MainActivity.cs)

MainActivity.cs

namespace SimpleMapTest
{
    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]
    public class MainActivity : AppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.activity_main);
        }
    }
}

仅设置布局文件中定义的内容视图

  1. 在清单中为我的 Google Maps API 密钥添加所需的行

显现

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="SimpleMapTest.SimpleMapTest">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="[MyKeyValue]" />
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    </application>
</manifest>
  1. 编译应用程序。该应用程序部署正常,已启动,但是当即将显示地图时,出现此错误。

超时异常

  1. 然后,一行不改,直接进入项目属性界面,改为针对Android Oreo(8.1)编译

工作 SDK 编译

  1. 编译东西,部署并运行应用程序,应用程序成功运行

成功

  1. 回到项目属性,将目标改回 Android Pie (9.0) 并重新编译和部署。应用程序编译、部署并开始运行,但这次我在运行时遇到的异常是这个:

无类定义

  1. 在线搜索,发现我可能需要通过在清单中添加以下行来解决此错误

显现

<uses-library android:name="org.apache.http.legacy" android:required="false" />

我想这应该是关于 Android 9 改变了它处理 HTTP 请求的方式

  1. 我已经在清单中添加了该行,重新编译,部署并在运行时返回了我第一次遇到的相同异常,涉及超时

超时异常

  1. 如果我检查输出,并在超时后得到这个异常详细信息

输出

02-10 10:50:48.352 W/t.SimpleMapTes(28585): Unsupported class loader
02-10 10:50:48.358 W/t.SimpleMapTes(28585): Skipping duplicate class check due to unsupported classloader
02-10 10:50:49.082 E/AndroidRuntime(28585): FATAL EXCEPTION: Thread-6
02-10 10:50:49.082 E/AndroidRuntime(28585): Process: SimpleMapTest.SimpleMapTest, PID: 28585
02-10 10:50:49.082 E/AndroidRuntime(28585): java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;

这似乎表明第 9 步中详述的解决方法不再可行,这与本文相符(第一反应):

文章

解决方法

所以有点回到第一广场!

那么,构建一个在片段中使用谷歌地图的面向 Android Pie 的应用程序应该是正确的方法吗?我在这里迷路了!任何人都可以分享一个可能对所有人有用的解释?

我知道我添加到清单中的行现在是强制性的,但仍然出现超时超出异常。看来google play服务的nuget包已经过期了……是这样的吗?

标签: androidxamarinxamarin.android

解决方案


推荐阅读