2013-09-29 7 views
8

मैं एक ऐप रखता हूं, यह सर्वर से संदेश प्राप्त करेगा और उपयोगकर्ता को एक संवाद देगा। तो जब फोन लॉक स्क्रीन पर है तो मैं संवाद दिखाऊंगा लॉक स्क्रीन के शीर्ष पर लेकिन इसे अनलॉक नहीं करें। क्या कोई मुझे सुझाव दे सकता है?एंड्रॉइड: लॉक स्क्रीन पर संवाद या गतिविधि कैसे दिखाएं [स्क्रीन अनलॉक नहीं करें]

उत्तर

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

अंत में मैंने वही हासिल किया। गतिविधि के लिए मत जाओ, क्योंकि एंड्रॉइड सुरक्षा कारण के लिए आपकी गतिविधि के पीछे लॉक स्क्रीन नहीं दिखाएगा, इसलिए गतिविधि के बजाय सेवा का उपयोग करें।

नीचे मेरी सेवा

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

की onStartCommand में मेरी कोड है और प्रकट करने के लिए

+1

धन्यवाद, इससे मेरे लिए अंतर आया है, अगर आप इसे लॉकस्क्रीन पर दिखाना चाहते हैं तो गतिविधि का उपयोग न करें और पृष्ठभूमि पर लॉकस्क्रीन –

+0

@AdibFara तो, हम किस शोल का उपयोग करते हैं? – kadik

+0

@kadik आप इसके बजाय सेवा का उपयोग कर सकते हैं, कृपया –

11

मैं निम्नलिखित तरीके से कुछ इसी तरह हल <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> जोड़ें। कार्रवाई को प्रसारित करने के लिए, "ACTION_SCREEN_ON & ACTION_USER_PRESENT & ACTION_SCREEN_OFF", WINDOW_SERVICE के साथ विंडो दिखाने के लिए फ़ंक्शन बनाएं। मैं अपनी आवश्यकताओं के लिए एक सेवा का उपयोग करता हूं, लेकिन यह अनुकूलित कर सकता है।

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

मुझे आशा है कि यह उपयोगी होगा!

+1

से ऊपर का उत्तर देखें, मैं सही समाधान खोज रहा था, धन्यवाद gfirem और Unihedro। –

+0

क्या आप fragment_overlay साझा कर सकते हैं? –

+0

धन्यवाद! यह काम करता है लेकिन FLAG_DISMISS_KEYGUARD https://stackoverflow.com/a/32233473/4229910 के साथ नहीं – ashwinx

संबंधित मुद्दे