2014-07-23 18 views
18

Sul ultima versione di Android applicazione Facebook ha mostrato funzione di notifica schermata di blocco, come questa immagine di:Android Facebook schermata di blocco notifica

screenshot

Qualcuno ha cercato di attuare questa?

So che è semplice mostrare l'attività in cima alla schermata di blocco, ma sfortunatamente non funziona con lo sfondo traslucido. Fondamentalmente funziona ma sotto la nostra attività vediamo la schermata di avvio, non la schermata di blocco (come la schermata di blocco in questo caso sarebbe anche trasparente).

Quello che ho cercato in questo momento è:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

nella mia attività.

Inoltre ho provato questo esempio: https://gist.github.com/daichan4649/5352944

E come ho descritto - tutto funziona, ma senza trasparenza.

Dalla mia osservazione Facebook utilizza tema:

@android:style/Theme.Translucent.NoTitleBar 

e non ha il permesso:

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

Inoltre ho notato che la notifica schermata di blocco acquisisce tocchi per cui non possiamo mostrare le notifiche dalla barra di stato dal gesto .

Qualsiasi idea su come creare questo tipo di notifica prima dell'uscita di Android L.

+0

ne dite di creare un'attività con un'immagine di sfondo (che è traslucido)? –

+0

Lo stesso - se uso lo stile traslucido, vedo la schermata di avvio sotto il mio Actvity, non la schermata di blocco. Se non uso traslucido, ho uno sfondo nero (dalla finestra) sotto lo sfondo dell'immagine. –

+0

Ritengo che non sia possibile su vanilla android..Il suo specifico funzionamento su HTC One M8 con Android 4.4.2 con Sense 6. refer-http: //techcrunch.com/2014/07/08/facebook-tests-android-l -style-lock-screen-notifiche/e http://lifehacker.com/floatify-brings-android-ls-new-notifications-to-any-and-1601708892 –

risposta

17

realtà, ferdy182 era/è qualcosa.

Ecco quello che ho ottenuto con il android.permission.SYSTEM_ALERT_WINDOW:

enter image description here

Quindi, non ho potuto fare questo con un Activity. Semplicemente non avrebbe funzionato. Ho dovuto implementare un Service che ha aggiunto un View utilizzando il WindowManager.

Un possibile flusso di lavoro potrebbe essere: una trasmissione viene ricevuta dal tuo BroadcastReceiver => si avvia un servizio => il servizio aggiunge la vista richiesta.

Ora, il codice (i commenti che spiegano alcune cose):

public class MyService extends Service { 

    View mView; 

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

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

     // instance of WindowManager 
     WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     LayoutInflater mInflater = (LayoutInflater) 
             getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     // inflate required layout file 
     mView = mInflater.inflate(R.layout.abc, null); 

     // attach OnClickListener 
     mView.findViewById(R.id.some_id).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // you can fire an Intent accordingly - to deal with the click event 
       // stop the service - this also removes `mView` from the window 
       // because onDestroy() is called - that's where we remove `mView` 
       stopSelf(); 
      } 
     }); 

     // the LayoutParams for `mView` 
     // main attraction here is `TYPE_SYSTEM_ERROR` 
     // as you noted above, `TYPE_SYSTEM_ALERT` does not work on the lockscreen 
     // `TYPE_SYSTEM_OVERLAY` works very well but is focusable - no click events 
     // `TYPE_SYSTEM_ERROR` supports all these requirements 
     WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0, 
      WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
         PixelFormat.RGBA_8888); 

     // finally, add the view to window 
     mWindowManager.addView(mView, mLayoutParams); 
    } 

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

     // remove `mView` from the window 
     removeViewFromWindow(); 
    } 

    // Removes `mView` from the window 
    public void removeNow() { 
     if (mView != null) { 
      WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
      wm.removeView(mView); 
     } 
    } 
} 

E, infine, aggiungere il permesso di manifestare la vostra applicazione:

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

Hai testato questo codice? – roiberg

+1

@roiberg Sì. Pensavo che mettere lo screenshot lo avrebbe chiarito. – Vikram

+0

Grazie amico !!! Approverò la tua risposta tra qualche ora. – roiberg

0

Penso che probabilmente stia usando lo stesso trucco delle bolle di testa Chat per Messenger.

In pratica si utilizza questa autorizzazione "android.permission.SYSTEM_ALERT_WINDOW" per visualizzare le vostre opinioni al di sopra di altre applicazioni.

Non ci ho provato ma sono abbastanza sicuro che lo abbiano usato.

Dalla documentazione "Consente ad un'applicazione di aprire finestre utilizzando il tipo TYPE_SYSTEM_ALERT, mostrato in cima a tutte le altre applicazioni." http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

+1

Mostra su tutte le altre applicazioni ma non sulla parte superiore della schermata di blocco. Ecco perché non puoi vedere le chathead sulla tua schermata di blocco. –