2014-07-23 29 views
18

Android एप्लिकेशन फेसबुक के नवीनतम संस्करण पर लॉक स्क्रीन सूचना सुविधा से पता चला है, इस स्क्रीनशॉट पर की तरह:एंड्रॉयड फेसबुक लॉक स्क्रीन अधिसूचना

screenshot

किसी को भी इस को लागू करने की कोशिश की?

मुझे पता है कि लॉक स्क्रीन के शीर्ष पर गतिविधि दिखाना आसान है, लेकिन दुर्भाग्य से यह पारदर्शी पृष्ठभूमि के साथ काम नहीं करता है। असल में यह काम करता है लेकिन हमारी गतिविधि के नीचे हम लॉन्चर स्क्रीन देखते हैं, लॉक स्क्रीन नहीं (जैसे इस मामले में लॉक स्क्रीन भी पारदर्शी होगी)।

क्या मैं अब सही करने की कोशिश की है:

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); 
मेरे गतिविधि में

इसके अलावा, मैं इस उदाहरण की कोशिश की: https://gist.github.com/daichan4649/5352944

और जैसा कि मैं वर्णित - सब कुछ काम करता है, लेकिन कोई पारदर्शिता।

मेरी अवलोकन फेसबुक से विषय का उपयोग करता है:

@android:style/Theme.Translucent.NoTitleBar 

और अनुमति नहीं है:

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

इसके अलावा मैंने देखा लॉक स्क्रीन अधिसूचना aquires कि छूता है तो हम नहीं सूचनाएं स्थिति बार से इशारा करके दिखा सकते हैं ।

कोई भी विचार एंड्रॉइड एल रिलीज से पहले इस तरह की अधिसूचना कैसे बनाएं।

+0

कैसे एक पृष्ठभूमि छवि के साथ एक गतिविधि बनाने के बारे में (जो पारदर्शी है)? –

+0

वही - अगर मैं पारदर्शी शैली का उपयोग करता हूं तो मुझे लॉक स्क्रीन पर नहीं, मेरी एक्टिविटी के नीचे लॉन्चर स्क्रीन दिखाई देती है। अगर मैं पारदर्शी का उपयोग नहीं करता हूं तो मेरे पास छवि पृष्ठभूमि के नीचे काली पृष्ठभूमि (खिड़की से) है। –

+0

मुझे लगता है कि वेनिला एंड्रॉइड पर यह संभव नहीं है .. यह विशेष रूप से सेंस 6 के साथ एंड्रॉइड 4.4.2 चलाने वाले एचटीसी वन एम 8 पर चल रहा है। देखें- http: //techcrunch.com/2014/07/08/facebook-tests-android-l स्टाइल-लॉक-स्क्रीन-नोटिफिकेशन/और http://lifehacker.com/floatify-brings-android-ls-new-notifications-to-any-and-1601708892 –

उत्तर

17

वास्तव में, ferdy182 था/कुछ पर है। मैं एक Activity के साथ ऐसा नहीं कर सकता है

enter image description here

तो,:

यहाँ है कि मैं क्या android.permission.SYSTEM_ALERT_WINDOW का उपयोग कर मिल गया है। यह सिर्फ काम नहीं करेगा। मुझे Service को कार्यान्वित करना पड़ा जिसने WindowManager का उपयोग करके View जोड़ा।

एक संभावित वर्कफ़्लो होगा: आपके BroadcastReceiver => द्वारा एक प्रसारण प्राप्त होता है> यह सेवा => सेवा आवश्यक दृश्य जोड़ता है।

अब, कोड (टिप्पणी के लिए कुछ चीजें समझाने):

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

और अंत में, आपके ऐप की मेनिफेस्ट करने की अनुमति जोड़ें:

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

क्या आपने इस कोड का परीक्षण किया था? – roiberg

+1

@roiberg हां। मैंने सोचा था कि स्क्रीनशॉट डालने से यह स्पष्ट हो गया होगा। – Vikram

+0

धन्यवाद आदमी !!! मैं आपके जवाब को कुछ घंटों में स्वीकृति दूंगा। – roiberg

0

मुझे लगता है कि यह शायद मैसेंजर के लिए चैट हेड बुलबुले के समान चाल का उपयोग कर रहा है।

असल में आप इस अनुमति का उपयोग "android.permission.SYSTEM_ALERT_WINDOW" अन्य ऐप्स के ऊपर अपने विचार प्रदर्शित करने के लिए करते हैं।

मैंने खुद की कोशिश नहीं की है, लेकिन मुझे पूरा यकीन है कि उन्होंने इसका उपयोग किया था।

डॉक्स से "एप्लिकेशन प्रकार TYPE_SYSTEM_ALERT, अन्य सभी अनुप्रयोगों के शीर्ष पर दिखाया का उपयोग कर खिड़कियों को खोलने के लिए अनुमति देता है।" http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

+1

यह अन्य सभी अनुप्रयोगों पर दिखाता है लेकिन लॉकस्क्रीन के शीर्ष पर नहीं। यही कारण है कि आप अपनी लॉकस्क्रीन पर चैटहेड नहीं देख सकते हैं। –

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