xamarin 打开深层链接时找不到显式活动类

gg58donl  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(87)

我有Xamarin。Android应用程序在API 32上有Deeplink。在我将API更新到33后,Deeplink已中断。我在日志中有此异常:

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@230413045@23.04.13 (190408-505809224):2)
    at hcl.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at com.google.android.chimera.android.Activity.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at hgx.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at hcl.public_startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at hcm.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):3)
    at android.app.Activity.startActivityForResult(Activity.java:5508)
    at hcm.platform_startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at hcl.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at com.google.android.chimera.android.Activity.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at hgx.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at hcl.public_startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at hcm.startActivityForResult(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at android.app.Activity.startActivity(Activity.java:6011)
    at hcm.platform_startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at hcl.startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at com.google.android.chimera.android.Activity.startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at hcl.public_startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):2)
    at hcm.startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):3)
    at android.app.Activity.startActivity(Activity.java:5978)
    at hcm.platform_startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at hcl.startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at com.google.android.chimera.android.Activity.startActivity(:com.google.android.gms@230413045@23.04.13 (190408-505809224):1)
    at kmv.x(:com.google.android.gms@230413045@23.04.13 (190408-505809224):4)
    at kmw.onPostExecute(:com.google.android.gms@230413045@23.04.13 (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文件。没有什么真正的帮助。自己的分析显示问题是the list of activities中有两个MainActivity。我还附加了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
{
...
}

UPD:有时候我会有这样的例外:

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
bejyjqdl

bejyjqdl1#

从您发布的生成的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从一个应用程序导航到另一个。

    • 注:**

如果您已经为您的MainActivity设置了ActivityAttribute MainLauncher = true,您就不需要在文件Manifest.xml上设置它,这很容易导致生成您所说的两个MainActivity
换句话说,您不需要向生成的Manifest.xml文件中添加任何代码。
如需了解更多信息,请查看:Working with the Android Manifest.

a0zr77ik

a0zr77ik2#

当Android应用尝试使用Intent启动Activity,但指定的Activity类找不到或不存在时,通常会发生"ActivityNotFoundException"错误。您可以尝试以下一些方法:
问题可能是由于Activity类名不正确造成的,因此请确保Intent中的Activity类名正确,包括包名称。
还要确保Activity类必须在AndroidManifest.xml文件中声明,否则Android系统将无法识别它。
如果您的代码中存在Activity类,但您仍然遇到此错误,则可能是因为您的APK文件中未包含Activity类。如果您的代码中未正确引用该类,或者构建过程从APK中排除该类,则可能会发生这种情况。
如果Activity类是通过深层链接启动的,只需确保在AndroidManifest.xml文件中为Activity设置了正确的Intent过滤器。
从API 32到API 33的更新也有可能导致Android框架发生了影响深层链接的更改。您可能需要查看Android Developer文档,了解API 33处理深层链接的方式是否发生了任何更改,并对代码进行相应的必要更新。
我希望这些发现能帮助你消除疑虑。
谢谢。

相关问题