У меня было приложение Xamarin.Android с глубокими ссылками на API32. После того, как я обновил API до 33, Deeplinks сломался. У меня было это исключение в моих журналах:
Time Device Name Type PID Tag Message
02-14 08:25:48.878 OnePlus IN2015 Error 16453 AcceptInvitation android.content.ActivityNotFoundException: Unable to find explicit activity class {PACKAGENAME/crc645ff435851f1c2612.MainActivity}; have you declared this activity in your AndroidManifest.xml, or does your intent not match its declared <intent-filter>?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2184)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1831)
at android.app.Activity.startActivityForResult(Activity.java:5555)
at hcm.platform_startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):2)
at hcl.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):2)
at com.google.android.chimera.android.Activity.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):2)
at hgx.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):2)
at hcl.public_startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):2)
at hcm.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):3)
at android.app.Activity.startActivityForResult(Activity.java:5508)
at hcm.platform_startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):1)
at hcl.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):1)
at com.google.android.chimera.android.Activity.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):1)
at hgx.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):1)
at hcl.public_startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):1)
at hcm.startActivityForResult(:com.google.android.gms@[email protected] (190408-505809224):1)
at android.app.Activity.startActivity(Activity.java:6011)
at hcm.platform_startActivity(:com.google.android.gms@[email protected] (190408-505809224):2)
at hcl.startActivity(:com.google.android.gms@[email protected] (190408-505809224):2)
at com.google.android.chimera.android.Activity.startActivity(:com.google.android.gms@[email protected] (190408-505809224):2)
at hcl.public_startActivity(:com.google.android.gms@[email protected] (190408-505809224):2)
at hcm.startActivity(:com.google.android.gms@[email protected] (190408-505809224):3)
at android.app.Activity.startActivity(Activity.java:5978)
at hcm.platform_startActivity(:com.google.android.gms@[email protected] (190408-505809224):1)
at hcl.startActivity(:com.google.android.gms@[email protected] (190408-505809224):1)
at com.google.android.chimera.android.Activity.startActivity(:com.google.android.gms@[email protected] (190408-505809224):1)
at kmv.x(:com.google.android.gms@[email protected] (190408-505809224):4)
at kmw.onPostExecute(:com.google.android.gms@[email protected] (190408-505809224):3)
at android.os.AsyncTask.finish(AsyncTask.java:771)
at android.os.AsyncTask.-$$Nest$mfinish(Unknown Source:0)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:240)
at android.os.Looper.loop(Looper.java:351)
at android.app.ActivityThread.main(ActivityThread.java:8355)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)
Пробовал гуглить решение этой проблемы, много перепробовал: Изменены настройки ProGuard, Проверял разные вариации вызова MainActivity с именем сборки и просто с точкой, Обновлены мои библиотеки и SDK, Я пытался прописать другие действия, Проверил сборки работают как в отладке, так и в релизе, Проанализированы файлы dex. Ничего особо не помогает. Собственный анализ показал, что проблема в том, что есть две MainActivities в список активностей. Я также прилагаю AndroidManifest:
...
<application android:requestLegacyExternalStorage = "true"
android:allowBackup = "true" android:icon = "@mipmap/icon"
android:largeHeap = "true" android:supportsRtl = "true"
android:label = "@string/app_name"
android:theme = "@style/AppTheme"
android:localeConfig = "@xml/locales_config"
android:name = ".MyApplication">
...
<activity android:name = ".MainActivity" android:exported = "true">
<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 = "https" />
<data android:scheme = "http" />
<data android:host = "SITE.com" />
<data android:host = "OWN.LINK" />
</intent-filter>
</activity>
...
</application>
Класс MainActivity имеет атрибут MainLauncher. Помоги мне, пожалуйста! Я потратил на это день и боюсь, что без посторонней помощи могу застрять надолго. Кажется, что ошибка может быть очевидной.
[Activity(ScreenOrientation = ScreenOrientation.Portrait, NoHistory = true, MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
...
}
УПД: Иногда у меня было это исключение:
Time Device Name Type PID Tag Message
02-14 08:38:29.150 OnePlus IN2015 Info 28812 MonoDroid Caused by: java.lang.ClassNotFoundException: Didn't find class "PACKAGENAME.MainActivity" on path: DexPathList[[zip file "/data/app/~~jXWlqXqgllqjZ1bi2qN5dg==/PACKAGENAME-gqSZGEIemXo6mh-lUysz-w==/base.apk"],nativeLibraryDirectories=[/data/app/~~jXWlqXqgllqjZ1bi2qN5dg==/PACKAGENAME-gqSZGEIemXo6mh-lUysz-w==/lib/arm64, /data/app/~~jXWlqXqgllqjZ1bi2qN5dg==/PACKAGENAME-gqSZGEIemXo6mh-lUysz-w==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(SourceFile:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1347)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3745)
... 12 more
@burnsi извини. Хорошо, я исправлю
Ошибка «ActivityNotFoundException» обычно возникает, когда приложение Android пытается запустить действие с помощью намерения, но указанный класс действия не может быть найден или не существует. Вы можете попробовать ниже некоторые хитовые и пробные методы:
Проблема может быть связана с неправильным именем класса активности, поэтому убедитесь, что имя класса активности в вашем намерении указано правильно, включая имя пакета.
Также убедитесь, что класс активности должен быть объявлен в вашем файле AndroidManifest.xml, иначе он не будет распознан системой Android.
Если класс Activity присутствует в вашем коде, но вы по-прежнему сталкиваетесь с этой ошибкой, это может быть связано с тем, что класс Activity не включен в ваш APK-файл. Это может произойти, если класс неправильно указан в коде или если процесс сборки исключает класс из APK.
Если класс Activity запускается через ссылку на контент, просто убедитесь, что для Activity в файле AndroidManifest.xml настроены правильные фильтры Intent.
Также возможно, что обновление API 32 до API 33 могло вызвать изменения в платформе Android, влияющие на ваши ссылки на контент. Вы можете проверить документацию для разработчиков Android на наличие изменений в способе обработки глубоких ссылок в API 33 и соответствующим образом внести необходимые обновления в свой код.
Я надеюсь, что эти выводы помогут вам развеять ваши сомнения.
Спасибо.
В сгенерированном Manifest.xml
файле, который вы разместили, я не смог найти следующее intent-filter
:
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
поэтому вы можете перепроверить, правильно ли вы установили MainLauncher = true
для своей деятельности.
Вы можете обратиться к моей настройке следующим образом:
[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 : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
}
И вы можете обратиться к аналогичной теме здесь: Переход от одного приложения к другому с помощью Xamarin.
Примечание:
Если вы установили ActivityAttribute MainLauncher = true
для своей MainActivity, вам не нужно устанавливать его в файле Manifest.xml
, что легко приводит к созданию двух MainActivity
, как вы сказали.
Другими словами, вам не нужно добавлять какой-либо код в генерируемый файл Manifest.xml
.
Для получения дополнительной информации, пожалуйста, проверьте:Работа с манифестом Android.
Спасибо! Прошу прощения, забыл сказать, что я добавляю «MainLauncher = true» в MainActivity. Теперь я обновляю свой пост и добавляю код MainActivity.
Вы добавили тег `<activity android:name = ".MainActivity" android:exported = "true">` из AndroidManifest.xml
вручную? Вам не нужно добавлять его вручную.
@jessie-zhang-msft Ага. Я добавляю этот блок вручную. Как я могу получить его от генератора?
Ой! Я сейчас читаю вашу ссылку. И понять, что я могу сделать. Я попытаюсь добавить фильтр намерений к атрибутам активности.
Пожалуйста, не добавляйте сообщения об ошибках в виде изображений. Изображения приветствуются, если вы проясните вопрос. Но, пожалуйста, публикуйте сообщения об ошибках в виде форматированного текста в своем вопросе.