【问题标题】:Programmatically enabling/disabling accessibility settings on Android device以编程方式启用/禁用 Android 设备上的辅助功能设置
【发布时间】:2016-11-16 13:03:38
【问题描述】:

如何以编程方式启用/禁用 Android 屏幕阅读器服务,例如 TalkBack?

我正在开发一个信息亭类型的应用程序,该应用程序将安装在 Android 设备上,当游客参观特定博物馆时,该应用程序将借给他们。 (我们仍在确定我们将使用什么设备。)计划是只允许用户使用我们的应用程序,而不能访问 android 设置应用程序。但是,我们希望允许用户配置一些辅助功能设置。当他们完成设备后,我们需要将所有设置恢复为默认设置。

以下链接中的讨论有很多建议启动 Android 的设置应用程序。但我们不希望用户访问许多其他设置。

How to Programmatically Enable/Disable Accessibility Service in Android

【问题讨论】:

  • 你的应用会被系统应用签名吗?
  • 有可能。这需要让它工作吗?
  • 查看 StackOverflow 上的其他帖子,click here
  • 嗨约翰,你有任何解决方案吗?我也在寻找同样的东西。如果您有解决方案,请发布您的答案
  • Anuj,我的计划是让系统签名的应用程序声明 WRITE_SECURE_SETTINGS 权限,以便我可以使用 Settings.Secure.putString 更新必要的设置。

标签: android accessibility kiosk


【解决方案1】:

只有系统应用才能以编程方式启用/禁用无障碍服务。 系统应用可以直接写入settingssecure db启动无障碍服务。

Settings.Secure.putString(getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.packagename/com.packagename.componentname");

在设置安全数据库中写入需要以下权限:

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

对于非系统应用,启动无障碍服务的唯一方法是通过意图将它们引导到无障碍设置屏幕并让用户手动启动服务:

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);

【讨论】:

  • 我可以通过将 Settings.Secure.ACCESSIBILITY_ENABLED 设置为 1 或 0 来让我的系统签名应用启用/禁用对讲。但是,当我通过将其设置为 0 禁用对讲时,会显示一条错误消息“很遗憾,Pico TTS 已停止”。有人对如何防止显示该错误消息有任何建议吗?
  • 首先从 Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES 中删除对讲条目,然后将 ACCESSIBILITY_ENABLED 更新为 0
  • 我仍然遇到同样的错误。但是,我注意到标准的 Android 设置应用程序也会发生同样的事情。所以我认为这个错误与我安装的 TalkBack 版本有关。我希望一旦我获得了我将使用的实际设备,这不会成为问题。
  • 我认为问题是对讲无障碍服务没有正确关闭 tts
【解决方案2】:

从棒棒糖中,您无法更改所有破坏安全性的设置 政策。其中一些您可以访问,但您必须获得许可 为了那个原因。所以请不要在这上面浪费时间。

【讨论】:

    【解决方案3】:

    我认为,如果您将应用设置为 AccessibilityService,则可能有一种方法可以做到这一点(但您必须在安装后手动启用它)。

    然后在您的 AccessibilityService 类中,在 onAccessibilityEventmethod 内,您可以(递归地)浏览视图并执行点击 - 在下面的示例中,它将点击设置中的 TalkBack 项目 - 之后它应该在下一个屏幕上切换切换按钮(诀窍是您可以单击父级而不是切换视图本身)-我还没有尝试过此代码:)

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        AccessibilityNodeInfo source = event.getSource();        
        if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) 
            explore(source);
    
    }
    
    private void explore(AccessibilityNodeInfo view){
        int count = view.getChildCount();
        for(int i=0; i<count; i++){
            AccessibilityNodeInfo child = view.getChild(i);
            if(!MODE_TALK_BACK_SCREEN){
                if(child.getText()!=null && child.getText().toString().toLowerCase().contains("TalkBack")){
                    child.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    MODE_TALK_BACK_SCREEN=true;
                    return;
                }
            }else{
                if("ToggleButton".equals(child.getClassName().toString())){ //there ony one toggle button on the screen
                    child.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
                    performGlobalAction(GLOBAL_ACTION_BACK);
                    performGlobalAction(GLOBAL_ACTION_BACK);//need to go back two time - i don't know if that will work :)
                    return;
                }
            }
            explore(child);
            child.recycle();
        }
    

    所以现在,如果您使用 Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); 打开可访问性设置,它将为您执行点击 - 您必须以某种方式使用全屏 toast 或带视图的服务来覆盖它

    我目前正在研究自动飞行模式切换,它可以工作 - 所以应该在你的情况下完成这项工作

    看看我的 serviceconfig.xml

    <accessibility-service     xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:packageNames="com.android.settings"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
    />
    

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 2012-04-21
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多