【问题标题】:Highlighting a menu item in system settings突出显示系统设置中的菜单项
【发布时间】:2020-11-08 17:41:53
【问题描述】:

试图提出一个我在这里找到的未回答的问题 - How to highlight android setting app menu item?

正如视频中看到的https://www.youtube.com/watch?v=eHXBc5Mmsqs

一旦您进入屏幕,“Power Shade”菜单项就会突出显示。我正在尝试向我的应用程序添加相同的功能,使用此突出显示功能将用户引导至设置菜单中的项目。我似乎找不到任何关于如何实际实现它的信息,也不知道它是否有我可以搜索的特定名称。

任何帮助将不胜感激!

【问题讨论】:

    标签: android android-fragments android-intent android-permissions android-settings


    【解决方案1】:

    在 Kotlin 中的 Fragment 中,您要检查用户是否已授予您的应用通知访问权限。此代码将向下滚动到列表项并突出显示它。使用三星 S20 设备在 Android 11 上运行。使用 onActivityResult() 或 Fragment 中的新 Activity result API 来检查用户是否确实授予了通知访问权限。

    private fun launchNotificationPermissionSettingsPageAndHighlight[your app]() {
    
            val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS").apply {
                val [your app] = "${requireContext().packageName}/${[your app service]::class.java.name}"
                val fragmentKey = ":settings:fragment_args_key"
                val showFragmentKey = ":settings:show_fragment_args"
                putExtra(fragmentKey, [your app])
                putExtra(showFragmentKey, Bundle().apply { putString(fragmentKey, [your app]) })
            }
    
            try {
                startActivityForResult(intent, requestCodeNotificationPermission)
                Toast.makeText(context, "Grant [your app] this permission", LENGTH_LONG).show()
            } catch (e: Exception) {
            }
        }
    

    【讨论】:

    • 嗨@Rvb84,我正在从我的片段中启动以下意图。 val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)。一旦启动,我需要突出显示我的应用程序名称。但是您共享的上述代码不起作用。请帮忙
    • 您好stackoverflow.com/users/11310951/rvb84,请您就上述请求提供帮助。 [your app service]::class.java.name}" 逻辑不适用于 USAGE STATS 意图。因此请指导。
    • 我的回答只适用于这个特定的 ACTION_NOTIFICATION_LISTENER_SETTINGS。如果它也可以用于其他系统设置,您需要做一些研究。它不是官方支持的 API,所以很有可能,您的 ACTION_USAGE_ACCESS_SETTINGS 是不可能的。
    • 嗨@Rvb84 stackoverflow.com/users/11310951/rvb84,我真的尽力了,做了所有可能的研究,尝试了所有方法,但我无法实现。自 7 天以来,我一直在为此苦苦挣扎,我日复一日地努力实现它,但没有结果。请你帮我试一次。只有一次或分享任何可以帮助我的东西。这有点紧急和重要。因此寻求帮助。
    【解决方案2】:

    反编译应用程序后,它的工作原理如下(简化):

    Intent intent = new Intent("com.samsung.accessibility.installed_service");
    if (intent.resolveActivity(context.getPackageManager()) == null) {
        intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
    }
        
    final String EXTRA_FRAGMENT_ARG_KEY = ":settings:fragment_args_key";
    final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = ":settings:show_fragment_args";
        
    Bundle bundle = new Bundle();
    String showArgs = context.getPackageName() + "/" + MyService.class.getName();
    bundle.putString(EXTRA_FRAGMENT_ARG_KEY, showArgs);
    intent.putExtra(EXTRA_FRAGMENT_ARG_KEY, showArgs);
    intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, bundle);
        
    try {
        context.startActivity(intent);
        String toastText = "Find PowerShade here";
        Toast.makeText(context, toastText, LENGTH_LONG).show();
    } catch (Exception e) {
        // ask user to grant permission manually
    }
    

    基本上它使用了 Android 的未记录功能(请参阅 Android 源代码中的 SettingsActivity.java)。

    【讨论】:

    • SAW 许可是否有类似的东西,也许?从 Android 11 开始,使用 Settings.ACTION_MANAGE_OVERLAY_PERMISSION 将忽略包名称,而是显示可以拥有此权限的所有应用的列表:developer.android.com/reference/android/provider/…。所以也许有一种方法至少可以像这里一样滚动和突出显示?
    • “我的服务”应该是什么?此外,Settings.ACTION_MANAGE_OVERLAY_PERMISSION 的任何解决方案?我在使用 Android 11 时遇到了同样的问题,我想引导用户使用特定的应用程序。
    • @Kzaf MyService 是您尝试授予权限的服务。不幸的是,我不知道 Android 11 的解决方案 - 只是反编译代码并(几乎)按原样发布。
    • 你如何找到如何为不同的设备执行这些操作?
    • 这不再适用于新的三星设备。看起来他们改变了什么?任何人都知道如何使这项工作?
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多