以编程方式启用/禁用Android设备上的辅助功能设置

时间:2016-07-13 19:30:27

标签: android accessibility kiosk

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

我正在开发一个自助服务终端类型的应用程序,该应用程序将安装在Android设备上,当他们访问特定博物馆时将被借给访问者。 (我们仍然在确定我们将使用什么设备。)计划是仅允许用户使用我们的应用程序而无法访问android设置应用程序。但是,我们希望允许用户配置一些辅助功能设置。完成设备后,我们需要将所有设置恢复为默认设置。

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

How to Programmatically Enable/Disable Accessibility Service in Android

3 个答案:

答案 0 :(得分:6)

只有系统应用程序才能以编程方式启用/禁用辅助功能服务。 系统应用程序可以直接在设置安全数据库中写入以启动辅助功能服务。

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

需要以下权限才能在设置安全db:

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

对于非系统应用程序,只有启动辅助功能服务的方法是通过意图将它们指向辅助功能设置屏幕,并让用户手动启动服务:

Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);

答案 1 :(得分:3)

我认为如果您将应用设为AccessibilityService,可能有办法实现这一目标(但您必须在安装后手动启用它)。

然后在您的AccessibilityService类中,您可以在onAccessibilityEvent方法中探索视图(递归)并执行点击 - 在下面的示例中,它将点击设置中的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);打开辅助功能设置,它将为您执行点击操作 - 您必须以某种方式覆盖全屏烤面包或带视图的服务

我目前正在进行自动飞机模式切换并且它有效 - 所以应该在你的情况下完成工作

查看我的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"
/>

答案 2 :(得分:0)

  

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