MAUI Android 应用程序中的深层链接问题:ClassNotFoundException

问题描述 投票:0回答:2

我正在尝试在我的 MAUI Android 应用程序中实现深度链接来处理 ed2k 链接。但是,当我单击 ed2k 链接并选择我的应用程序将其打开时,出现以下错误:

Java.Lang.RuntimeException:'无法实例化活动ComponentInfo {com.mycompany.test_maui/com.mycompany.test_maui.test_maui.MainActivity}: java.lang.ClassNotFoundException:在路径上找不到类“com.mycompany.test_maui.test_maui.MainActivity”: DexPathList[[zip 文件“/data/app/com.mycompany.test_maui-xpJaFrKRoLluech0atEfZQ==/base.apk”], nativeLibraryDirectories=[/data/app/com.mycompany.test_maui-xpJaFrKRoLluech0atEfZQ==/lib/arm64, /data/app/com.mycompany.test_maui-xpJaFrKRoLluech0atEfZQ==/base.apk!/lib/arm64-v8a、/system/lib64、/hw_product/lib64、/system/product/lib64、/prets/lib64]]

我尝试了多种解决方案,包括确保 MainActivity.cs 中的命名空间与 AndroidManifest.xml 中指定的命名空间相匹配。以下是我的 AndroidManifest.xml 文件和 MainActivity.cs 文件中的相关代码:

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mycompany.test_maui">
  <application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true" android:usesCleartextTraffic="true">
    <activity android:name=".MainActivity" android:exported="true">
      <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="ed2k" />
      </intent-filter>
    </activity>
  </application>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.INTERNET" />
</manifest>

MainActivity.cs:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Widget;

namespace test_maui
{
    [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
    public class MainActivity : MauiAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Check if the activity was started from a link
            if (Android.Content.Intent.ActionView.Equals(Intent.Action))
            {
                // Get the link
                var elink = Intent.DataString;

                // Display a message on screen with the link
                Toast.MakeText(this, "ed2k Link: " + elink, ToastLength.Long).Show();
            }
        }
    }
}

我期望单击 ed2k 链接后,我的应用程序将打开并在屏幕上显示一条带有该链接的消息。然而,我却收到了上述错误。

希望这可以帮助您解答问题。

android .net xamarin maui deep-linking
2个回答
0
投票

我认为您没有在

AndroidManifest.xml
文件中正确设置应用程序链接。

首先,您只是声明了一个非常通用的

ed2k
schema
类型,并且没有
host
与之关联。 虽然仅声明
schema
并不是特别错误,但通过明确期望应用程序链接指向特定网站,您的声明似乎可以更加具体。

接下来,您缺少顶级

android:autoVerify="true"
过滤器属性,这将使操作系统能够更好地处理您的应用程序链接。

在继续之前,我邀请您阅读官方文档,以更好地熟悉该过程。

最后但并非最不重要的一点是,还有一个非常有用的 Android Studio 面板,它不仅可以帮助您创建应用程序链接,还可以直接在 IDE 中验证它们。 这里有一些关于该主题的更多文档

综上所述,一旦您进行了所需的调整,我希望您的

intent-filter
声明看起来如下:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="ed2k" />
  <data android:host="<your_website_goes_here" />
</intent-filter>

在结束之前,我想指出,一旦您的应用程序链接也发布到生产环境中,您就必须在 Play Console 中声明它们,这里有关于此事的 更多文档


0
投票

Java.Lang.RuntimeException:'无法实例化活动 组件信息{com.mycompany.test_maui/com.mycompany.test_maui.test_maui.MainActivity}: java.lang.ClassNotFoundException:未找到类 “com.mycompany.test_maui.test_maui.MainActivity”

Xamarin.Android
上,默认情况下,使用基于 MD5 的类名生成 Java 包装器,以避免 Java 类名冲突,例如:

 md579731053346ff64fcf21847b09163ce1.MainActivity 

您已在清单中硬编码了

activity android:name=".MainActivity"
,但生成的类默认情况下将基于 MD5。

您应该避免混淆声明性属性并手动编写

AndroidManifest.xml

[Activity (Label = "MyApp", MainLauncher = true, Icon = "@mipmap/ic_launcher")]
正在实际使用(生成)
AndroidManifest.xml
中生成一段代码,如下所示:

  <activity android:icon="@drawable/icon" android:label="AndroidApp1" android:name="md5c178831cd46fc53bebc42cf953f78ced.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

你的代码将在其他地方。您可以在输出文件夹

AndroidManifest.xml
中找到生成的
.\obj\Debug\android

因此,尝试从清单文件中删除手动编辑,并根据需要通过属性添加内容。

例如:

[Activity(Label = "SearchBarDemos", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true,Exported =true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
    [
    IntentFilter
    (
        new[] { Android.Content.Intent.ActionView },
        Categories = new[]
            {
                Android.Content.Intent.CategoryDefault,
                Android.Content.Intent.CategoryBrowsable
            },
        DataSchemes = new[] { "myapp" }
    )
]
    public class MainActivity:Activity
 {

 }
© www.soinside.com 2019 - 2024. All rights reserved.