2013-08-11 22 views
9

フロートアイコンはすべてのアクティビティの上にとどまりますが、デバイスがロックされるとデバイスがロック解除されるまで消えます。ロック画面でwindowmanagerを使用してビューを表示する

もう1つの意味は、サービスからのウィンドウマネージャを使用してロック画面にビュー(FloatIcon)を表示することです。

これまでのコードです。

public class FloatIcon extends Service { 

    private WindowManager windowManager; 
    private ImageView floatIcon; 

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

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

     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     floatIcon = new ImageView(this); 
     floatIcon.setImageResource(R.drawable.ic_launcher); 
     floatIcon.setClickable(true); 
     floatIcon.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getBaseContext(), MainActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplication().startActivity(intent); 
      } 
     }); 

     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
        + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); 

     params.gravity = Gravity.TOP | Gravity.LEFT; 
     params.x = 0; 
     params.y = 100; 

     windowManager.addView(floatIcon, params); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (floatIcon != null) 
      windowManager.removeView(floatIcon); 
    } 
} 

グーグルでは何か便利なものが得られませんでした。

+0

この問題は解決しましたか?もしそうなら、どうやってそれを作ったのか教えてください。 – TahaYusuf

答えて

8

この問題を解決するWindowManager.LayoutParams.TYPE_PHONEではなく、WindowManager.LayoutParams.TYPE_SYSTEM_ERRORを使用してください。これにより、ビューはタッチイベントを聴くことができます。あなたもWindowManager.LayoutParams.TYPE_SYSTEM_OVERLAYを使用することができますが、質問が答えているが、それは文句を言わないイベント

+0

これがどのようにして問題を解決するか詳しく説明できますか? – Kmeixner

+0

@KmeixnerウィンドウマネージャーのパラメータとしてSYSTER_ERRORを使用すると、そのパラメータがロック画面に表示され、そのすべてのタッチイベントが動作する他のすべての画面が表示されますが、SYSTEM_OVERLAYを使用してすべてのビューを表示することもできます画面にはロック画面が含まれていますが、タッチイベントはありません –

+0

これはほとんどすべてのデバイスで動作しますが、残念ながらSamsung S3で動作しませんでした。着信画面とロック画面の両方が、私がWindowManagerに追加していたビューと重なっています。 – milosmns

5

に触れることを聞くしかし、いくつかの説明: - は、もしロック画面に表示されますFLAG_SHOW_WHEN_LOCKEDTYPE_PHONEウィンドウを使用してウィンドウは完全な画面 - 表示android referenceですが、TYPE_SYSTEM_ERRORウィンドウタイプはフルスクリーンの制限がないため、問題を解決しています。

と@milosmnsで尋ねたとして、これを回避するには、遅延を追加することができ、約100msの、着信画面上にウィンドウを表示しているあなたのコードには魅力のように動作しますと言います。

関連する問題