Xamarin Android 深层链接未能正常工作。

3

我正在使用Xamarin开发一个Android应用程序。 我想让用户在打开链接example://gizmos时能够打开应用程序,所以我将以下内容添加到我的清单文件中:

<activity    android:name="mynamespace.MyActivity"
android:label="@string/application_name" >
<intent-filter android:label="@string/application_name">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <!-- Accepts URIs that begin with "http://www.example.com/gizmos” -->
  <data android:scheme="http"
        android:host="www.example.com"
        android:pathPrefix="/gizmos" />
  <!-- note that the leading "/" is required for pathPrefix-->
  <!-- Accepts URIs that begin with "example://gizmos” -->
  <data android:scheme="example"
        android:host="gizmos" />

</intent-filter>
</activity>

这是直接从Android文档中获取的内容。我尝试在我的物理Android设备上从邮件应用程序中单击链接example://gizmos ,但我收到了此消息:无法执行此操作的应用程序编辑 这并不是与建议的重复内容相同,因为它们未使用Xamarin。

可能是Deep-linking intent does not work的重复问题。 - Demitrian
不是重复内容。他们甚至没有使用Xamarin。 - Drake
我也有同样的问题,对我来说是获取不到类异常(getting class not found exception)。 - Sreejith Sree
1个回答

9
在 Xamarin Android 中,活动配置是在活动类的属性中设置的。
例如:
namespace XamarinAndroidDeepLink
{
    [Activity(Label = "XamarinAndroidDeepLink", MainLauncher = true, Icon = "@drawable/icon")]
    [IntentFilter(new[] { Android.Content.Intent.ActionView },
    DataScheme = "wori",
    DataHost = "example.com",
    DataPathPrefix ="/",
    Categories = new[] { Android.Content.Intent.CategoryDefault,Android.Content.Intent.CategoryBrowsable })]
    public class MainActivity : Activity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);    
        }
    }
}
您无需在清单文件中设置意图过滤器,C#将帮助您在清单文件中构建配置。

通过adb测试深层链接:

adb shell am start -W -a android.intent.action.VIEW -d "wori://example.com/?id=1234" XamarinAndroidDeepLink.XamarinAndroidDeepLink

您将在您的应用程序开始时找到:

输入图像描述

有些浏览器无法区分URL。他们会在您的客户URL之前添加http://,并且当您在地址栏中输入URL时,它将使用搜索引擎。

我建议您设计自己的HTML页面,并下载Google Chrome以打开HTML页面:

注意:不要通过HTML查看器打开HTML页面

<html>
 <head>
  <title>Product 12345</title>
 </head>
 <body>
  <a href="wori://example.com/?id=1234">lalala</a>
 </body>
</html>

下载 Google Chrome 并打开链接:

在此输入图片描述


当我打开链接http://example.com时,它无法工作。我需要为此添加一些内容到“类别”吗? - Drake
1
@Darius,我已经编辑了答案,将DataScheme更改为“wori”。并通过浏览器打开它。请勿使用HTML查看器打开您的HTML页面,请使用Chrome浏览器。 - Mike Ma
这个有效,谢谢!不过我注意到了一些奇怪的事情:当我通过链接打开应用程序时,它会打开一个单独的应用程序(而不是使用已经打开的同一个应用程序),所以我打开了两个相同的应用程序。这只在我的Nexus 5设备上发生(在Galaxy S6上运行良好)。我注意到,当以这种方式打开应用程序时,应用程序的标题不同,它使用程序集名称(或命名空间)...所以我认为这就是原因。您知道如何指定要使用的名称,以便我可以(可能)避免这种情况吗? - Drake
1
@Darius,也许在您的Nexus 5设备上,这两个应用程序注册了相同的DataScheme。而应用程序标题是通过属性[[Activity(Label = "TITLE")]设置的,也许您打开了另一个具有不同标题的应用程序。请检查相同的DataScheme应用程序。或者将您的DataScheme更改为特殊的,例如DataScheme="lalala" - Mike Ma
我也遇到了同样的问题,对我来说是获取类未找到异常。请为我提供一个解决方案。 - Sreejith Sree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接