2

どのアプリケーションが一番上にあるかに関係なく、最後のユーザー操作がいつだったかを調べる必要があります。そのイベントがどこで、どのようなものであったかは気にしません。それがいつだったかを知る必要があるだけです。または、たまたま、イベントを受け取ります。

私は複数のことを試しました:

  1. ウィンドウでサービスを作成し、タッチ リスナーを追加します。これはタッチイベントを食べ、それを伝えませんでした
  2. シェルコマンドを探しました。getevent動作します(タッチを受信するたびに新しい行が入ります)が、ルートが必要なため、私にとっては適切な解決策ではありません。
  3. 「ロックまでの時間」を探しましたが、何も思いつきませんでした。

また、注意: タッチ位置などの識別情報は必要ないため、セキュリティ上の懸念はありません。ただのタイプスタンプ(またはライブイベント)。

私はそれを理解するためにリフレクションを使用することにもオープンです。


@ user2558882 には非常に優れたソリューションがあります。今のところ、これが私が見つけた最良のアプローチです。

これは素晴らしいことですが、ユーザーがアクセシビリティ コントロールでアプリケーションを手動で有効にする必要があります。何千ものデバイスをお持ちのお客様がおり、設定を自動的に更新および変更する方法があります。手動構成を最小限に抑えるように努めていますが、デバイス管理モードを有効にするなど、ユーザー入力が必要なものもあります。したがって、この解決策は受け入れられますが、有効にするためにユーザー入力を必要としない方法をまだ受け入れています。


アクセシビリティサービスを使用するという@ user2558882のアイデアを実装することになりました。他のアイデアは大歓迎ですが。

4

2 に答える 2

3

これは単なるアイデアであり、完全に譲渡できない場合があります。

AccessibilityService でできることは次のとおりです。

アクセシビリティ サービスはバックグラウンドで実行され、AccessibilityEvent が発生したときにシステムからコールバックを受け取ります。このようなイベントは、フォーカスが変更された、ボタンがクリックされたなど、ユーザー インターフェイスの状態遷移を示します。

内部のイベントについて通知されますonAccessibilityEvent(AccessibilityEvent)

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    // Some event

    timeSinceLastInteraction = System.currentTimeMillis();

}

更新を定期的にログに記録できます。

Log.i("LOG_TIME_ELAPSED", "Last user interaction was " + 
             ((System.currentTimeMillis() - timeSinceLastInteraction) / 1000) + 
                      " seconds ago.");

AccessibilityService を構成するには、次の 2 つの方法があります。

  1. コードでは、onServiceConnected() 内。(API 4 以降)

  2. xml では、meta-dataサービスでタグを使用します。(API 14 以降)

アプリケーションの場合、おそらく次のように設定できますAccessibilityServiceInfo.eventTypes

accessibilitySeviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;

ただし、TYPES_ALL_MASK には、AccessibilityEvent.TYPE_ANNOUNCEMENT、AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED などの通知が含まれます。これらは傍受する必要はないと思います。したがって、AccessibilityEvent.TYPE_X のサブセットを選択する必要があります。

注意すべきもう 1 つの点は、通知のタイムアウトです。

AccessibilityService が通知される前の特定のタイプの最新のイベント後のタイムアウト。

イベント通知タイムアウトは、イベントが頻繁にクライアントに伝播されるのを避けるのに役立ちます。タイムアウトは、イベントの生成がいつ落ち着いたかを判断する基準と考えることができます。

そのため、タイムアウト値には余裕を持ってください。

AccessibilityService オプションを使用する場合は、このページが非常に役立ちます:アクセシビリティ サービスの開発

あなたのコメントからクロエの答えまで、デバイスはあなたの管理下にあるようです。つまり、ある程度、サービスを有効にするためにユーザーに頼る必要はありません。

アクセシビリティ サービスのライフサイクルは、システムによって排他的に管理され、確立されたサービス ライフサイクルに従います。さらに、アクセシビリティ サービスの開始または停止は、デバイス設定で有効または無効にする明示的なユーザー アクションによってのみトリガーされます

展開時に AccessibilityService を有効にし、おそらくAppLockなどのアプリを使用して設定メニューへのアクセスを制限できます。

もう 1 つのオプションは、AccessibilityService が時々有効になっているかどうかを確認することです。

AccessibilityManager am = (AccessibilityManager)
                               getSystemService(ACCESSIBILITY_SERVICE);

List<AccessibilityServiceInfo> listOfServices = 
                             am.getEnabledAccessibilityServiceList(
                               AccessibilityServiceInfo.FEEDBACK_ALL_MASK);

for (AccessibilityServiceInfo asi : listOfServices) {

    // Check if your AccessibilityService is running

}

好奇心旺盛なユーザーや悪名高いユーザーによって AccessibilityService が無効にされた場合は、次のテキストを含むフルスクリーン ビューを表示してデバイスをロックできますDevice has been locked. Contact a Sales Rep to unlock this device

于 2013-09-25T22:53:01.257 に答える
1

透過的なサービス ウィンドウがタッチ イベントを消費しなかったことを示すには、false を返す必要があると思います。そうすれば、イベント ループはスタックを下のウィンドウに渡します。

https://developer.android.com/reference/android/view/View.OnTouchListener.html

もう 1 つの可能性は、モーション/加速度計イベントをリッスンするサービスを追加することです。

https://developer.android.com/guide/topics/sensors/sensors_motion.html

別の可能性は、 ACTION_USER_PRESENT をリッスンすることです

https://developer.android.com/reference/android/content/Intent.html#ACTION_USER_PRESENT

または ACTION_SCREEN_ON

https://developer.android.com/reference/android/content/Intent.html#ACTION_SCREEN_ON

于 2013-09-19T02:39:48.627 に答える