2013-08-11 16 views
9

पर विंडोमैनगर का उपयोग करके एक दृश्य प्रदर्शित करें मेरे पास एक फ्लोट आइकन है जो सभी गतिविधियों के शीर्ष पर रहता है, लेकिन जब डिवाइस लॉक हो जाता है तो डिवाइस अनलॉक होने तक गायब हो जाता है।लॉक स्क्रीन

एक और अर्थ, मैं सेवा से विंडोमैनगर का उपयोग कर लॉक स्क्रीन पर एक दृश्य (फ़्लोट आइकन) प्रदर्शित करना चाहता हूं।

यह मेरा कोड अब तक है।

public class FloatIcon extends Service { 

    private WindowManager windowManager; 
    private ImageView floatIcon; 

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

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

     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     floatIcon = new ImageView(this); 
     floatIcon.setImageResource(R.drawable.ic_launcher); 
     floatIcon.setClickable(true); 
     floatIcon.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getBaseContext(), MainActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplication().startActivity(intent); 
      } 
     }); 

     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
        + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); 

     params.gravity = Gravity.TOP | Gravity.LEFT; 
     params.x = 0; 
     params.y = 100; 

     windowManager.addView(floatIcon, params); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (floatIcon != null) 
      windowManager.removeView(floatIcon); 
    } 
} 

जब मैं इसे Google करता हूं तो मुझे कुछ उपयोगी नहीं मिल सका।

+0

क्या आपने इस समस्या को हल किया है? यदि हां, तो क्या आप कृपया मुझे बता सकते हैं कि आपने इसे कैसे बनाया? – TahaYusuf

उत्तर

8

WindowManager.LayoutParams.TYPE_SYSTEM_ERROR का उपयोग WindowManager.LayoutParams.TYPE_PHONE जो समस्या को हल करेगा। इससे दृश्य घटनाओं को सुनने में सक्षम हो जाएगा। आप भी WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY उपयोग कर सकते हैं हालांकि, लेकिन यह अभ्यस्त हालांकि सवाल का जवाब दे रहा है घटनाओं

+0

क्या आप इस बारे में विस्तार से बता सकते हैं कि यह समस्या कैसे हल करता है? – Kmeixner

+0

@Kmeixner यदि आप विंडोमैनर पैराम्स के लिए SYSTER_ERROR के प्रकार के रूप में उपयोग करते हैं तो यह उस पैराम के साथ जोड़ा जाएगा जो लॉकस्क्रीन में दिखाई देता है और सभी टच इवेंट्स के साथ अन्य सभी स्क्रीनें दिखाई देती हैं, हालांकि आप दृश्य में सभी को देखने के लिए SYSTEM_OVERLAY का भी उपयोग कर सकते हैं लॉकस्क्रीन सहित स्क्रीनें लेकिन इसमें कोई टच इवेंट नहीं है –

+0

हालांकि यह लगभग सभी उपकरणों पर काम करता है, दुर्भाग्यवश मैंने सैमसंग एस 3 पर परीक्षण किया, जहां यह काम नहीं करता था। इनकमिंग कॉल स्क्रीन और लॉकस्क्रीन दोनों व्यू I को विंडोमैनेजर में जोड़ रहा था। – milosmns

5

को छूने के लिए सुनो, कुछ स्पष्टीकरण: - FLAG_SHOW_WHEN_LOCKED साथ TYPE_PHONE विंडो का उपयोग केवल लॉक स्क्रीन है कि पर दिखाई देगा खिड़की पूर्ण स्क्रीन है- android reference पर जाएं, जबकि का उपयोग कर TYPE_SYSTEM_ERROR विंडो प्रकार में पूर्ण स्क्रीन प्रतिबंध नहीं है, इस प्रकार समस्या को हल करना।

और @ मिलोस्मन्स द्वारा पूछे जाने पर, इसके लिए एक कामकाज आपके कोड में आने वाली कॉल स्क्रीन पर एक विंडो प्रदर्शित करने वाले 100 एमएमएस में देरी जोड़ सकता है, जो एक आकर्षण की तरह काम करेगा।

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