Проблема с глубокими ссылками в приложении MAUI для Android: ClassNotFoundException

Я пытаюсь реализовать 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 мое приложение откроется и отобразит на экране сообщение со ссылкой. Однако вместо этого я получаю вышеупомянутую ошибку.

Надеюсь, это поможет вам ответить на вопросы.

0
0
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не думаю, что вы правильно настраиваете ссылку на приложение внутри своего AndroidManifest.xml файла.

Прежде всего, вы объявляете только очень общий ed2kschema тип и не 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, как только они будут опубликованы в рабочей среде, и вот еще дополнительная документация по этому вопросу.

Спасибо за ваше время и усилия, ответив на мой вопрос. Однако, похоже, произошло недоразумение. Ссылки ed2k не связаны с конкретным веб-сайтом, поэтому мне не нужно указывать хост в моем фильтре намерений. Ссылки ed2k используются сетью eDonkey2000 (а также ее производной eMule) для обмена файлами. Например, ссылка ed2k может выглядеть так: ed2k://|file|example.txt|123456789|0123456789abcdef012345678‌​9abcdef|/ Я также хотел бы отметить, что я разрабатываю свое приложение в Visual Studio 2022, а не в Android Studio. Еще раз спасибо за вашу помощь.

Carlos García 21.06.2024 21:13

Предоставленный. Но вам все еще не хватает атрибута autoVerify, и я также рекомендую вам взглянуть на инструмент App Link Assistant в Android Studio, чтобы создавать и/или проверять ссылки на ваши приложения. Я уверен, что вы сможете найти ответ на этот вопрос.

Iván Garza Bermea 21.06.2024 21:15

Я ценю ваши предложения. Я уже пробовал добавить атрибут autoVerify, но, к сожалению, все равно получаю ту же ошибку. Что касается инструмента App Link Assistant, я обязательно рассмотрю его. Еще раз спасибо за вашу помощь

Carlos García 21.06.2024 21:22
Ответ принят как подходящий

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
 {

 }

Просто хотел сказать, что ваш совет сработал как чудо. Действительно ценю это!

Carlos García 23.06.2024 21:11

Рад, что могу вам помочь. Хорошего дня. :)

Jessie Zhang -MSFT 24.06.2024 04:27

Другие вопросы по теме