2012-04-01 26 views
9

में प्रोग्रामेटिक रूप से स्क्रीन चालू करें मैं अलार्म एप्लिकेशन विकसित कर रहा हूं। मुख्य गतिविधि से मैंने प्रसारण का उपयोग कर अलार्म सेट किया। फिर प्रसारण रिसीवर में रिसीव में मैं गतिविधि को कॉल करता हूं जो उपयोगकर्ता को अलार्म को बंद या स्नूज़ करने में सक्षम बनाता है ... उस गतिविधि में, ऑनक्रेट की शुरुआत में मैं स्क्रीन को चालू करने और अनलॉक करने के लिए इस लाइन का उपयोग करता हूं:एंड्रॉइड

final Window win = getWindow(); 
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

यह एंड्रॉइड 2.3.4 के साथ सैमसंग गैलेक्सी एस 2 पर बिल्कुल सही काम करता है लेकिन एंड्रॉइड 2.3.5 के साथ एचटीसी पर काम नहीं करता है। एचटीसी पर यह कुछ भी नहीं करता है, और जब मैं लॉक बटन स्क्रीन दबाता हूं तो सर्कल को ड्रैग किए बिना स्वचालित रूप से अनलॉक करता है। इसकी तरह flag_dissmiss_keygard काम कर रहा है लेकिन flag_turn_screen_on isnt नहीं है। क्या ऐसा करने का कोई और तरीका या दूसरा समाधान है?

उत्तर

14

मैंने आपके जैसे बहुत से शुरुआत की, और खिड़की के झंडे वास्तव में काम नहीं करते थे। KEYGUARD_SERVICE और POWER_SERVICE:

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); 
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP 
     | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 

भूल सक्रिय करने वाले लॉक जारी करने के लिए नहीं है जब आप इसे पूरा कर चुके हैं

मैं अंत में यह दो एंड्रॉयड सेवाओं का उपयोग करके काम करने के लिए मिला है।

आपको अनुमतियों DISABLE_KEYGUARD और WAKE_LOCK

+0

मैं नेक्सस वन (2.3.6) और नेक्सस एस (4.1.1) पर यह कोशिश की है और यह बहुत अच्छी तरह से काम करता है। – nifo

+4

डेवलपर्स, मैं आपसे विनती करता हूं: कृपया यह मत करो !!! बस एक चेतावनी डालना चाहते हैं कि कीगार्ड को अक्षम करने से वह क्या कहता है: यह किसी भी पिन या पैटर्न अनलॉक को छोड़ देता है। घर (जिंजरब्रेड) या ऐप स्विच बटन (आईसीएस) की एक लंबी प्रेस का प्रयास करें और आप देखेंगे कि मेरा क्या मतलब है। मुझे सबसे लोकप्रिय फोन पर लेआउट पैराम्स का उपयोग करने में कोई समस्या नहीं है, और जिंजरब्रेड फोन की संख्या दैनिक नीचे जा रही है। कृपया विंडो झंडे पर पुनर्विचार करें! –

+2

हे @ पैट्रिकहोर्न क्या आप किसी डिवाइस का एक उदाहरण निर्दिष्ट कर सकते हैं जिसमें यह पिन लॉक स्क्रीन को छोड़ देता है। मेरे परीक्षणों में मैं उस संदेश के साथ उपयोगकर्ता को एक स्क्रीन प्रदर्शित कर सकता हूं, और दूसरा उपयोगकर्ता घर पर हिट करने या ऐप स्विच करने का प्रयास करता है, उसे पिन पिन दर्ज होता है। तो यह मेरे लिए पर्याप्त सुरक्षित लग रहा था। – marmor

1

मैं अपने अनुप्रयोग के लिए कई समस्याओं का सामना करना पड़ा का अनुरोध करना होगा। वास्तव में जब मैं बैक बटन दो बार दबाता हूं तो मैं स्क्रीन लॉक चाहता हूं। और जब उपयोगकर्ता होम बटन दबाता है तो अनलॉक करें।

डिवाइस मार्मर कोड को अनलॉक करने के लिए सही है। :) मैंने इस कोड का उपयोग किया है।

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
       WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
               | PowerManager.ACQUIRE_CAUSES_WAKEUP 
               | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
       wakeLock.acquire(); 
+1

मेरे डिवाइस में यह समाधान केवल स्क्रीन चालू करता है लेकिन एंड्रॉइड अनलॉक न करें। क्या मुझे somethin जोड़ने की ज़रूरत है? – Manza

+0

@Manza मार्मर द्वारा दिए गए नीचे दिए गए उत्तर से कोड का उपयोग करें। वह डिवाइस को अनलॉक कर देगा। –

2

यहाँ समाधान

WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.TYPE_SYSTEM_ALERT | 
        LayoutParams.TYPE_SYSTEM_OVERLAY, 
        LayoutParams.FLAG_NOT_TOUCH_MODAL | 
        LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
        LayoutParams.FLAG_KEEP_SCREEN_ON| 
        LayoutParams.FLAG_DISMISS_KEYGUARD| 
        LayoutParams.FLAG_TURN_SCREEN_ON, 
      PixelFormat.TRANSPARENT); 

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
    km.isKeyguardLocked(); 

    windowManager.addView(mTopView, params); 
    getWindow().setBackgroundDrawable(); 
+0

क्या इसे किसी अनुमति की आवश्यकता है? –

+0

देरी के लिए खेद है, मैंने AndroidManifest.xml <उपयोग-अनुमति एंड्रॉइड: name = "android.permission.DISABLE_KEYGUARD" /> में अनुमति दी है – koteswarao