web-dev-qa-db-ja.com

プログラムでユーザー補助設定を有効/無効にするAndroidデバイス

プログラムでAndroid TalkBackなどのスクリーンリーダーサービスを有効/無効にするにはどうすればよいですか?

私は、Androidデバイスにインストールされるキオスクタイプのアプリケーションを開発しています。このデバイスは、訪問者が特定の博物館を訪問しているときに貸し出されます(現在、どのデバイスを使用するかを決定中です。使用します。)Android設定アプリケーションにアクセスできないようにして、ユーザーにアプリの使用のみを許可します。ただし、ユーザーが一部のアクセシビリティ設定を構成できるようにしたいと考えています。デバイスでの作業が完了したら、すべての設定をデフォルトに戻す必要があります。

以下のリンクでの議論は、Androidの設定アプリの起動を提案する多くのものを持っています。しかし、ユーザーが他の多くの設定にアクセスすることは望ましくありません。

Androidのプログラムでアクセシビリティサービスを有効/無効にする方法

10
John Weidner

プログラムでアクセシビリティサービスを有効/無効にできるのは、システムアプリだけです。システムアプリは、セキュリティで保護された設定を直接書き込んで、アクセシビリティサービスを開始できます。

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);
7
abhishesh

アプリを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);でアクセシビリティ設定を開くと、それはあなたのためにクリックを実行します-あなたはどういうわけかフルスクリーントーストまたはビュー付きのサービスでそれをカバーする必要があります

私は現在、自動機内モード切り替えに取り組んでおり、機能します-あなたの場合は仕事をするべきです

私の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"
/>
_
3
Tom

Lollipopからは、セキュリティポリシーに違反するすべての設定を変更することはできません。中にはアクセスできるものもありますが、許可を得る必要があります。だから、それに時間を無駄にしないでください。

0
parik dhakan