2013-08-11 14 views
9

üzerinde ve pencere kullanarak bir görünüm görüntüler, ancak cihaz kilitli olsun cihaz kilidi elde edene kadar o kaybolur.Ben tüm faaliyetlerin üstüne kalır bir şamandıra simgesi Kilit ekranında

Başka bir anlam ben hizmetten ve pencere kullanılarak Kilit ekranında bir görünümü (FloatIcon) görüntülemek istiyor.

Bu benim kodum şu ana kadar.

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); 
    } 
} 

Ben google bunu yaparken yararlı bir şey alamadım. sorunu çözecek

+0

Bu sorunu çözdünüz mü? Eğer öyleyse, nasıl yapıldığını bana söyler misin? – TahaYusuf

cevap

8

yerine WindowManager.LayoutParams.TYPE_PHONE Kullanımı WindowManager.LayoutParams.TYPE_SYSTEM_ERROR. Bu, görüşün dokunma olaylarını dinleyebilmesini sağlayacaktır. Ayrıca WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY kullanabilirsiniz ama soru cevaplanır rağmen alışkanlık olayları

+0

Bu sorunun nasıl çözüldüğünü açıklar mısınız? – Kmeixner

+0

@Kmeixner Eğer pencere yöneticisine için türü olarak SYSTER_ERROR kullanırsanız ancak ayrıca görüntüleme tümünde görünmesi için SYSTEM_OVERLAY kullanabilirsiniz, o lockscreens ve tüm dokunmatik olaylar çalışan diğer tüm ekranlarda görünmesi params bununla eklenir görünümü yapacak params Lockscreen dahil ekranlar, ancak herhangi bir dokunma olayı yaşanmayacak –

+0

Bu neredeyse tüm cihazlarda çalışsa da, maalesef Samsung S3 üzerinde çalıştım. Gelen çağrı ekranı ve kilit ekranı, View I'in her ikisini de WindowManager'a ekliyordu. – milosmns

5

dokunmak dinlemek Ancak, bazı açıklama: - sadece eğer kilit ekranında gösterecektir FLAG_SHOW_WHEN_LOCKED ile TYPE_PHONE penceresini kullanarak pencere böylece problem çözme, tam ekran kısıtlama yoktur TYPE_SYSTEM_ERROR pencere türünü kullanarak oysa, tam ekran gezmeden android reference olduğunu.

ve @milosmns tarafından sorulduğu gibi, bunun için bir geçici çözüm, yaklaşık çağrı çağrı ekranında bir pencere görüntüleyen kodunuza yaklaşık 100 ms gibi bir gecikme ekleyerek çekicilik gibi çalışacaktır.