2013-07-23 41 views
5

サービスを実行するアプリケーションを作成しました。このサービスには基本的にオーバーレイボタンがあり、クリック時のボタンは何かを行います。しかし、毎回、ボタンをクリックすると、ボタンの背景にあるアプリケーションが応答しています。助けてもらえますか?Android:オーバーレイボタンonClickが呼び出されない

linkを参照しました。ここで

は私のコードです:

サービスコード:

public class HUD extends Service implements OnTouchListener{ 
    Button mButton; 
    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     String s; 
     s = "Hari"; 

     return null; 
    } 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     //mView = new HUDView(this); 
     mButton = new Button(this); 
     mButton.setText("Overlay button"); 
     mButton.setOnTouchListener(this); 

     WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
       PixelFormat.TRANSLUCENT); 
     params.gravity = Gravity.RIGHT | Gravity.TOP; 
     params.setTitle("Load Average"); 
     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.addView(mButton, params); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(getBaseContext(),"onDestroy", Toast.LENGTH_LONG).show(); 
     if(mButton != null) 
     { 
      ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mButton); 
      mButton = null; 
     } 
    } 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Toast.makeText(this,"Overlay button event", Toast.LENGTH_SHORT).show(); 
     return false; 
    } 
} 

マニフェストは、同様に、次の権限を持っている:

私は

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.WRAP_CONTENT, 
     WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
     WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
に種類を変えてみました

ここをクリックすると、タッチイベントが呼び出されます。誰かが私を助けることができますか?

+0

オンタッチでfalseを返すと、アプリケーションに、ボタンに触れていないかのようにタッチを処理し続けるよう指示されます。真を返すようにしてください。 – anthonycr

答えて

6

問題は、WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYを使用していることです。私はいくつかのAndroid 4.x以来、それはもう使えないと思います。私がやったこと

public class OverlayButton extends Service implements OnTouchListener { 

    Button mButton; 
    WindowManager wm; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     mButton = new Button(this); 
     mButton.setText("Overlay button"); 
     mButton.setTextColor(Color.BLACK); 
     mButton.setOnTouchListener(this); 

     WindowManager.LayoutParams params = new WindowManager.LayoutParams(150, 
        150, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 
        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); 

     params.gravity = Gravity.LEFT | Gravity.CENTER; 
     wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.addView(mButton, params); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(getBaseContext(), "onDestroy", Toast.LENGTH_LONG).show(); 
     if (mButton != null) { 
      ((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mButton); 
      mButton = null; 
     } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_UP) { 
      Log.d("OverlayButton onTouch", "touched the button"); 
      stopSelf(); 
     } 
     return true; 
    } 
} 

は、私も彼に私は彼に触れた場合、再び消える能力を与えた:これは私がオーバーレイボタンを実現方法です。

これは私が彼に現れてみましょう方法です:あなただけの使用、あなたの活動から、それを起動した場合、

getActivity().startService(new Intent(getActivity().getBaseContext(), OverlayButton.class)); 

しかし:

そして、あなたにこれらを設定することを忘れないでくださいマニフェスト:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

とタグの内側も忘れないでください:

を0
<service android:name="OverlayButton" ></service> 
1

このWindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCHフラグを使用すると、ビューの外のすべての接触を監視するようにアプリに指示しています。

代わりにWindowManager.LayoutParams.FLAG_NOT_TOUCH_MODALをお試しください。これはあなたの意見だけを傍受します。

確認するには、WindowManager.LayoutParams.TYPE_SYSTEM_ALERTを使用して、ビューをクリック可能にする必要があります。

関連する問題