Я пытаюсь реализовать Deep Linking в своем Android-приложении MAUI для обработки ссылок 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, как только они будут опубликованы в рабочей среде, и вот еще дополнительная документация по этому вопросу.
Предоставленный. Но вам все еще не хватает атрибута autoVerify
, и я также рекомендую вам взглянуть на инструмент App Link Assistant в Android Studio, чтобы создавать и/или проверять ссылки на ваши приложения. Я уверен, что вы сможете найти ответ на этот вопрос.
Я ценю ваши предложения. Я уже пробовал добавить атрибут autoVerify, но, к сожалению, все равно получаю ту же ошибку. Что касается инструмента App Link Assistant, я обязательно рассмотрю его. Еще раз спасибо за вашу помощь
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"
В Xamarin.Android
по умолчанию создаются оболочки Java с использованием имен классов на основе MD5, чтобы избежать конфликта имен классов 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 = "Demos", 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
{
}
Просто хотел сказать, что ваш совет сработал как чудо. Действительно ценю это!
Рад, что могу вам помочь. Хорошего дня. :)
Спасибо за ваше время и усилия, ответив на мой вопрос. Однако, похоже, произошло недоразумение. Ссылки ed2k не связаны с конкретным веб-сайтом, поэтому мне не нужно указывать хост в моем фильтре намерений. Ссылки ed2k используются сетью eDonkey2000 (а также ее производной eMule) для обмена файлами. Например, ссылка ed2k может выглядеть так: ed2k://|file|example.txt|123456789|0123456789abcdef0123456789abcdef|/ Я также хотел бы отметить, что я разрабатываю свое приложение в Visual Studio 2022, а не в Android Studio. Еще раз спасибо за вашу помощь.