我正在尝试在我的 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 链接后,我的应用程序将打开并在屏幕上显示一条带有该链接的消息。然而,我却收到了上述错误。
希望这可以帮助您解答问题。
我认为您没有在
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 中声明它们,这里有关于此事的 更多文档 。
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
{
}