2013-08-11 11 views
9

Ho un'icona mobile che rimane in cima a tutte le attività, ma quando il dispositivo viene bloccato scompare finché il dispositivo non viene sbloccato.Visualizza una vista utilizzando windowmanager sulla schermata di blocco

Un altro significato, voglio visualizzare una vista (FloatIcon) sulla schermata di blocco usando windowmanager dal servizio.

Questo è il mio codice finora.

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

Non riesco a ottenere qualcosa di utile quando lo faccio su Google.

+0

Hai risolto questo problema? Se è così, potresti dirmi come l'hai fatta? – TahaYusuf

risposta

8

Utilizzare WindowManager.LayoutParams.TYPE_SYSTEM_ERROR invece di WindowManager.LayoutParams.TYPE_PHONE che risolverà il problema. Questo renderà la vista in grado di ascoltare gli eventi touch. Tuttavia è possibile utilizzare anche WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY ma non lo ascolto per toccare eventi

+0

Potresti approfondire come questo risolve il problema? – Kmeixner

+0

@Kmeixner Se si utilizza SYSTER_ERROR come tipo per i parametri di windowmanager, la vista che viene aggiunta con quel parametro viene visualizzata in lockscreens e tutte le altre schermate con tutti gli eventi touch funzionanti, tuttavia è possibile utilizzare anche SYSTEM_OVERLAY per far apparire la vista in tutto le schermate includono lockscreen ma non ci sono eventi touch –

+0

Anche se questo funziona su quasi tutti i dispositivi, sfortunatamente ho provato su Samsung S3, dove non funzionava. La schermata della chiamata in entrata e la schermata di blocco si sovrappongono entrambe alla vista che stavo aggiungendo al window manager. – milosmns

5

anche se la domanda si risponde, qualche spiegazione: - utilizzando la finestra TYPE_PHONE con FLAG_SHOW_WHEN_LOCKED verranno visualizzati solo sullo schermo di blocco se questo la finestra è a schermo intero -visit android reference, mentre l'uso del tipo di finestra TYPE_SYSTEM_ERROR non ha la restrizione a schermo intero, risolvendo così il problema.

e come richiesto da @milosmns, una soluzione per questo può aggiungere un ritardo dire circa 100 ms, al codice che visualizza una finestra sulla schermata di chiamata in arrivo funzionerà come un fascino.