2013-09-29 12 views

risposta

11
public void onAttachedToWindow() { 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
      | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
      | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
} 
8

Finalmente ho raggiunto lo stesso. Non andare per attività, perché Android non mostrerà schermata di blocco dietro l'attività per motivi di sicurezza, quindi utilizzare il servizio anziché Attività.

Qui di seguito è il mio codice in onStartCommand del mio servizio

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

View mView = mInflater.inflate(R.layout.score, null); 

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, 
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0, 
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
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); 

mWindowManager.addView(mView, mLayoutParams); 

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

+1

grazie, questo ha fatto la differenza per me, non utilizzare l'attività se si vuole mostrarlo su lockscreen e avere la schermata di blocco sullo sfondo –

+0

@AdibFara Quindi, che shoul usiamo? – kadik

+0

@kadik è possibile utilizzare il servizio, si prega di verificare la risposta sopra –

11

ho risolto qualcosa di simile nel modo seguente. Creare servizi, per trasmettere l'azione "ACTION_SCREEN_ON & ACTION_USER_PRESENT & ACTION_SCREEN_OFF", creare la funzione per mostrare le finestre con WINDOW_SERVICE. Uso un servizio per le mie esigenze, ma può adattarsi.

public class OverlayService extends Service { 

    private static final String TAG = OverlayService.class.getSimpleName(); 
    WindowManager mWindowManager; 
    View mView; 
    Animation mAnimation; 

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

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     registerOverlayReceiver(); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    private void showDialog(String aTitle){ 
     mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     mView = View.inflate(getApplicationContext(), R.layout.fragment_overlay, null); 
     mView.setTag(TAG); 

     int top = getApplicationContext().getResources().getDisplayMetrics().heightPixels/2; 

     RelativeLayout dialog = (RelativeLayout) mView.findViewById(R.id.dialog); 
     LayoutParams lp = (LayoutParams) dialog.getLayoutParams(); 
     lp.topMargin = top; 
     lp.bottomMargin = top; 
     mView.setLayoutParams(lp); 

     ImageButton imageButton = (ImageButton) mView.findViewById(R.id.close); 
     lp = (LayoutParams) imageButton.getLayoutParams(); 
     lp.topMargin = top - 58; 
     imageButton.setLayoutParams(lp); 
     imageButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mView.setVisibility(View.INVISIBLE); 
      } 
     }); 

     TextView title = (TextView) mView.findViewById(R.id.Title); 
     title.setText(aTitle); 

     final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
     ViewGroup.LayoutParams.MATCH_PARENT, 
     ViewGroup.LayoutParams.MATCH_PARENT, 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); 

     mView.setVisibility(View.VISIBLE); 
     mAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.in); 
     mView.startAnimation(mAnimation); 
     mWindowManager.addView(mView, mLayoutParams); 

    } 

    private void hideDialog(){ 
     if(mView != null && mWindowManager != null){ 
      mWindowManager.removeView(mView); 
      mView = null; 
     } 
    } 

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

    private void registerOverlayReceiver() { 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_SCREEN_ON); 
     filter.addAction(Intent.ACTION_SCREEN_OFF); 
     filter.addAction(Intent.ACTION_USER_PRESENT); 
     registerReceiver(overlayReceiver, filter); 
    } 

    private void unregisterOverlayReceiver() { 
     hideDialog(); 
     unregisterReceiver(overlayReceiver); 
    } 


    private BroadcastReceiver overlayReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      Log.d(TAG, "[onReceive]" + action); 
      if (action.equals(Intent.ACTION_SCREEN_ON)) { 
       showDialog("Esto es una prueba y se levanto desde"); 
      } 
      else if (action.equals(Intent.ACTION_USER_PRESENT)) { 
       hideDialog(); 
      } 
      else if (action.equals(Intent.ACTION_SCREEN_OFF)) { 
       hideDialog(); 
      } 
     } 
    }; 
} 

Spero sia utile!

+1

stavo cercando la soluzione esatta, grazie gfirem e Unihedro. –

+0

Puoi condividere fragment_overlay? –

+0

Grazie! Funziona ma non con FLAG_DISMISS_KEYGUARD https://stackoverflow.com/a/32233473/4229910 – ashwinx

Problemi correlati