7

電話のステータスバーにすべての通知を表示するアプリに取り組んでいます(新しいメッセージや不在着信など)。調査の結果、Android でこれを行う唯一の方法は、アクセシビリティ サービスを作成することであることがわかりました。そこで、アクセシビリティ サービスで AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED を取得して、同じことを行いました。
これが私の onServiceConnected() メソッドです:

public void onServiceConnected(){
    if (isInit) {
        return;
    }
    AccessibilityServiceInfo info = new AccessibilityServiceInfo();
    info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
    setServiceInfo(info);
    isInit = true;
}

これは機能していますが、私が望んでいるわけではありません。実際には、ステータスバーに表示されていない多くの通知が表示されており、おそらくバックグラウンドアプリによって生成されている可能性があります。また、リアルタイムではありません。アプリが開いている間ではなく、アプリを再度開いたときにのみ更新されます。さらに、設定でサービスを開始するとすぐに、私の電話 (galaxy note) がすべてを話し始めます。それがバグなのか、コードの問題なのかはわかりません。
問題がどこにあるのか正確にはわかりませんが、フィードバック型である可能性があると思います。私は多くのことを試しましたが、サービスのさまざまなフィードバック タイプの意味をどこでも見つけることができませんでした。

FEEDBACK_AUDIBLE
FEEDBACK_HAPTIC
FEEDBACK_AUDIBLE
FEEDBACK_VISUAL
FEEDBACK_GENERIC

これらのフィードバックの種類が何を意味するか教えてください。また、フィードバックの種類を変更すると、別の通知が届きますか? また、私が間違った方向に向かっていると思われる場合は、これらの問題を解決するために私にできることを教えてください. 重要な情報を提供するのを忘れたかどうかを教えてください。

どんな種類の助けも本当に感謝しています。

4

1 に答える 1

1

すべての質問にお答えできるわけではありませんが、何かお役に立てれば幸いです。あなたが言ったように、ステータスバーの通知だけが必要で、トーストなどの他の通知は必要ありません。そのため、サービスで次のコードを試すことができます。

public void onAccessibilityEvent(AccessibilityEvent event) {
    final int eventType = event.getEventType();
    if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
        Parcelable parcelable = event.getParcelableData();

        if(parcelable instanceof Notification){
            // statusbar notification
            List<CharSequence> messages = event.getText();
            if (messages.size() > 0) {
                // here you can do whatever you want with the notification.
                //Log.d(tag, "Saved event");
            }
        }
    }
}

また、次のように onServiceConnected でタイムアウトを設定します。

info.notificationTimeout=100;  

うまくいくことを願っています。

于 2013-11-14T08:41:48.230 に答える