2013-09-29 13 views

Odpowiedz

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

W końcu osiągnąłem to samo. Nie podejmuj działań, ponieważ ze względów bezpieczeństwa Android nie wyświetla ekranu blokady za Twoją aktywnością, więc skorzystaj z usługi zamiast z Aktywności.

Poniżej jest mój kod w onStartCommand mojego serwisu

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

I dodać <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> manifestować

+1

dziękuję, to zrobiło różnicę dla mnie, Nie używaj aktywności, jeśli chcesz pokazać ją na ekranie blokady i mieć blokadę w tle –

+0

@AdibFara Więc, co używamy? – kadik

+0

@kadik można użyć usługi zamiast, proszę sprawdzić odpowiedź powyżej –

11

Rozwiązałem coś podobnego w następujący sposób. Utwórz usługi, aby transmitować akcję "ACTION_SCREEN_ON & ACTION_SCREEN_OFF", utwórz funkcję, aby wyświetlić okna z numerem WINDOW_SERVICE. Korzystam z usługi dla moich wymagań, ale ona może się dostosować.

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

Mam nadzieję, że przyda się!

+1

szukałem dokładnego rozwiązania, dzięki gfirem i Unihedro. –

+0

Czy możesz udostępnić fragment_overlay? –

+0

Dzięki! Działa, ale nie z FLAG_DISMISS_KEYGUARD https://stackoverflow.com/a/32233473/4229910 – ashwinx

Powiązane problemy