由于三星设置应用程序崩溃,用户的 Android 12 深层链接关联失败

sne*_*yan 4 android deep-linking android-12

我的目标是 android 12 并使用此用户关联方法使我的深层链接由应用程序处理。

我显示一个带有 [转到设置] 按钮的对话框,要求从应用程序设置添加支持的链接。在 [转到设置] 上单击我运行此代码

val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
            Uri.parse("package:${context.packageName}"))
        startActivity(context, intent)
Run Code Online (Sandbox Code Playgroud)

这会在设备设置应用程序中打开我的应用程序[设置为默认]部分,用户可以在其中启用支持的网址。 在此输入图像描述

这适用于大多数设备。但对于三星 Galaxy s21(也许是所有配备 Android 12 的三星)设备,应用程序关闭时没有崩溃日志。

我发现崩溃发生在设备设置应用程序中,这是日志。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
    at com.android.settings.applications.intentpicker.AppLaunchSettings.onCreate(AppLaunchSettings.java:142)
    at androidx.fragment.app.Fragment.performCreate(Fragment.java:2976)
    at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:278)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:501)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
    at com.samsung.android.settings.core.SecMultiPaneActivity.onStart(SecMultiPaneActivity.java:198)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
    at android.app.Activity.performStart(Activity.java:8307)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4047)
    at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
    at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2425)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:226)
    at android.os.Looper.loop(Looper.java:313)
    at android.app.ActivityThread.main(ActivityThread.java:8582)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:563)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
Run Code Online (Sandbox Code Playgroud)

有办法克服这个问题吗?我什至无法在发送意图之前检查这一点,因为intent.resolveActivity返回非空结果。感谢帮助。

小智 7

无法在 Samsung OneUI 4 / Android 12 设备上打开该特定屏幕。这是三星设置应用程序中的一个错误。他们必须推送 OTA 系统更新才能修复该问题。我尝试了十几种变体,但没有任何效果,但是......

我设法打开此屏幕(“可以打开链接的应用程序”列表屏幕):

截图1

以编程方式通过android.settings.MANAGE_DOMAIN_URLS

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
{
    if (Build.MANUFACTURER.equalsIgnoreCase("samsung"))
    {
        Intent intent = new Intent();
        intent.setAction("android.settings.MANAGE_DOMAIN_URLS");
        context.startActivity(intent);
    }
    else
    {
        Intent intent = new Intent();
        intent.setAction(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS);
        intent.setData(Uri.parse("package:"+context.getPackageName()));
        context.startActivity(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以指示用户从列表中单击您的应用程序。将导航到这里:

截图2

然后指示用户导航到Supported web addresses并选中复选框:

截图3

您可以通过执行以下操作来检测用户是否选中了这些框:

private static String getAssociatedDeepLinkingUrlPackageName(@NonNull String url)
{
    Intent resolveIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
    ResolveInfo resolveInfo = applicationContext.getPackageManager().resolveActivity(resolveIntent, PackageManager.MATCH_DEFAULT_ONLY);
    return resolveInfo.activityInfo.packageName;
}
Run Code Online (Sandbox Code Playgroud)
if (!getAssociatedDeepLinkingUrlPackageName("https://www.example.com").equals(BuildConfig.APPLICATION_ID))
{
     //tell the user he needs to check the link in the settings app
     //show "go to settings" button, on click navigate to MANAGE_DOMAIN_URLS screen
     //tell the user instructions on what to do on that settings screen
}
Run Code Online (Sandbox Code Playgroud)