2017-08-23 2 views
0

他のすべてのアプリケーションの上に表示されるoverlayジェスチャ検出器を作りたいと思います。 オーバーレイはServiceから開始されます。オーバーレイでタッチイベントを検出してさらにそれらを渡す

私は触れてからタッチイベントがが何らかの形で記録され、現在アクティブなアプリケーションにさらに派遣することができアイコンを重ねた場合にだけチェックするために、サンプルサービスを作った:

class GestureDetectorService : Service() { 
override fun onBind(intent: Intent?): IBinder? = null 

val windowManager: WindowManager 
    get() = getSystemService(Context.WINDOW_SERVICE) as WindowManager 

var iv: AppCompatImageView? = null 

override fun onCreate() { 
    super.onCreate() 
    iv = AppCompatImageView(this) 
    iv?.setImageResource(R.drawable.icon) 

    iv?.setOnTouchListener { view, motionEvent -> 
     when (motionEvent.action) { 
      MotionEvent.ACTION_DOWN -> { 
       Log.d("Click", "From icon") 
       false 
      } 
      else -> false 
     } 
    } 

    val params: WindowManager.LayoutParams = WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT 
      , WindowManager.LayoutParams.WRAP_CONTENT 
      , WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
      or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
      or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS 
      or WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR 
      or WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED 
      , PixelFormat.TRANSLUCENT) 

    params.gravity = Gravity.TOP or Gravity.LEFT 
    params.x = 100 
    params.y = 100 

    windowManager.addView(iv, params) 
} 

override fun onDestroy() { 
    super.onDestroy() 
    iv.let { windowManager.removeView(iv) } 
} 
} 

運。

たとえば、ユーザーが特定の速度のFlingを実行するとき、または画面上で特定の形状を「描画」するときを検出したいとします。これは、たとえばメモ帳の起動をトリガーします。

しかし、通常のアプリのやりとりをブロックすることは望ましくありません。ユーザーは通常どおりにアプリが起動されたものとやり取りできなければなりません。

Kotlinの簡潔な答えはすごくいいですが、もしあなたがJavaで何かを考え出すなら、それも素晴らしいでしょう。

答えて

2

おそらく、ルートデバイスやカスタムファームウェアを除いて、これは可能ではありません。

あなたが描写しているのは、タップジャック攻撃です。つまり、同じ入力を通っている間にユーザー入力を盗んで、通常の効果があります。これは、Android 4.0以降、プライバシーとセキュリティの理由からブロックされています。

+0

すぐにお返事ありがとうございます。私は、まれなことではないかもしれないと思っていました。RedMoonやMessengerのような他のアプリの上にさまざまな種類のアプリを描いています。だから、画面上に何かを描いたり、触ったり、何かを描いたり触れたりすることはできないと思っていますが、それ以上の伝播はありませんか?回避策はありますか、これは間違いなくブロックされていますか? – laszlo

+0

@laszlo:「スクリーンに何かを描いても、触ったり、何かを描いたり触れたりすることはできませんが、それ以上は伝播しません。 - 正しい。 "回避策はありますか?" - セキュリティ上の欠陥を表すものではないと確信しています。 – CommonsWare

関連する問題