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 系统更新才能修复该问题。我尝试了十几种变体,但没有任何效果,但是......
我设法打开此屏幕(“可以打开链接的应用程序”列表屏幕):
以编程方式通过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)
您可以指示用户从列表中单击您的应用程序。将导航到这里:
然后指示用户导航到Supported web addresses并选中复选框:
您可以通过执行以下操作来检测用户是否选中了这些框:
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)
| 归档时间: |
|
| 查看次数: |
2491 次 |
| 最近记录: |