【问题标题】:Launch Xamarin Android App Via a Browser Using Custom URL Scheme使用自定义 URL 方案通过浏览器启动 Xamarin Android 应用程序
【发布时间】:2019-01-22 11:09:00
【问题描述】:

程序

我有一个需要 URL 方案的跨平台 Xamarin 项目。为了在 Xamarin Android 上启用此功能,我在 AndroidManifest.xml 文件中添加了以下代码,引用了 launch custom android application 帖子。

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="urlschemetest" android:host="testurl" />
    </intent-filter>
</activity>

在 Android 的浏览器中直接输入 urlschemetest://testurl 会转到 Google 搜索,而不是启动应用程序。所以,我有一个简单的html 页面,其中有一个用于打开应用程序的超链接test url scheme

<a href="urlschemetest://testurl">open app</a>

问题

通过单击上面的超链接,应用程序不会启动。 Visual Studio 在输出中显示Unhandled Exception 错误

Java.Lang.RuntimeException:无法实例化活动 ComponentInfo{com.companyname.UrlSchemeTest/com.companyname.UrlSchemeTest.MainActivity}: java.lang.ClassNotFoundException:找不到类 路径上的“com.companyname.UrlSchemeTest.MainActivity”:DexPathList [[zip 文件 "/data/app/com.companyname.UrlSchemeTest-1/base.apk"],nativeLibraryDirectories=[/data/app/com.companyname.UrlSchemeTest-1/lib/arm, /data/app/com.companyname.UrlSchemeTest-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]

尝试的解决方案

1) 我查看了AndroidManifest.xml 中的attributes,可能是因为package 属性与@987654331 中使用的namespace 不匹配@。所以我改了。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   android:versionCode="1" 
   android:versionName="1.0" 
   package="UrlSchemeTest.Droid" 
   android:installLocation="auto">

MainActivity.cs

namespace UrlSchemeTest.Droid
{
    [Activity(Label = "UrlSchemeTest", Icon = "@mipmap/icon", 
        Theme = "@style/MainTheme", MainLauncher = true, 
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity :global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
         //body here
    }
}

2) 在&lt;activity&gt; 标签中使用绝对类名

<activity android:name="UrlSchemeTest.Droid.MainActivity">

3) 为了查看这是否是模拟器错误,我已经在 Android 模拟器和真正的 Android 设备上测试了该应用程序。

注意:尽管我在 Android 和 iOS 上创建了这个 Xamarin simple demo,但这个问题是关于让它在 Android 平台上运行的。

【问题讨论】:

    标签: xamarin.android deep-linking intentfilter url-scheme applinks


    【解决方案1】:

    说明

    最初,我认为活动名称是命名空间(或包名)和类名的组合。本机 Android 和 Xamarin Android 5.1 之前的版本都是如此。 Xamarin Android 5.1 及更高版本并非如此,如docs中所述

    从 Xamarin.Android 5.1 开始,活动的类型名称基于要导出的类型的程序集限定名称的 MD5SUM。

    使用我的Xamarin simple demo 应用程序,如果您构建它并打开UrlSchemeTest.Android/obj/Debug/android 文件夹中的AndroidManifest.xml 文件,您会看到如下内容

    <activity 
        android:configChanges="orientation|screenSize" 
        android:icon="@mipmap/icon" android:label="UrlSchemeTest" 
        android:theme="@style/MainTheme" 
        android:name="md56cd34387ec86a2e1e9ba0754e1c30e2c.MainActivity">
    

    如您所见,活动名称是md5 sum和类名的组合。

    因此,当我在 AndroidManifest.xml 中创建活动时,我在构建时发生了冲突

    解决方案

    首先,我需要删除AndroidManifest.xml 中的活动。在demo中,需要删除以下代码

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="urlschemetest" android:host="testurl" />
        </intent-filter>
    </activity>
    

    然后,在MainActivity.cs添加 IntentFilter 属性

    using Android.App;
    using Android.Content;
    
    [IntentFilter(new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
        DataScheme = "urlschemetest",
        DataHost = "testurl")]
    public class MainActivity :global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            //code here
        }
    }
    

    Url Scheme 现在应该可以工作了。

    作为建议,我认为我们应该尽量不要修改AndroidManifest.xml

    Xamarin.Android 允许您将自定义属性添加到您的类中,从而帮助您最大程度地减少这一困难,这些属性随后将用于自动为您生成清单。我们的目标是让 99% 的用户永远不需要手动修改 AndroidManifest.xml。

    【讨论】:

    • 您好,“urlschemetest”方案仍然有效吗?在我的情况下,没有检测到模式作为应用程序的链接,它只适用于 https 和 http 方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多