2013-01-11 29 views
11

पर बिना स्क्रीन के बंद करें मुझे पता है कि इस सवाल से कई बार पूछा गया है लेकिन इसे कभी भी संतोषजनक उत्तर नहीं दिया गया है।एंड्रॉइड - स्टैंडबाय मोड

मेरे समस्या है निम्नलिखित:

मैं एक गतिविधि है जो समय की एक पूर्वनिर्धारित राशि के लिए बंद किया जा रहा से स्क्रीन से बचाता है।

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

जब पूर्वनिर्धारित समय के साथ मैं उपयोगकर्ता कि प्रदर्शन 10 सेकंड में बंद हो जाएगा अगर वह प्रेस नहीं करता "अभी नहीं" को सूचित करने के लिए उलटी गिनती के साथ एक संवाद को दिखाने के लिए है।

मैं डिस्प्ले बंद करने में कामयाब रहा लेकिन फोन हमेशा स्टैंडबाय-मोड में स्विच करता है।

बंद के लिए मैं प्रयोग किया है:

Window mywindow = getWindow(); 

WindowManager.LayoutParams lp = mywindow.getAttributes(); 

lp.screenBrightness = 0.0f; 

mywindow.setAttributes(lp); 

वहाँ किसी भी संभावना को पूरी तरह से अतिरिक्त-मोड के लिए जा रहा है (जो गतिविधि रुक ​​जाता है) के बिना प्रदर्शन को काला करने है।

मेरा लक्ष्य यह है कि उपयोगकर्ता स्क्रीन को फिर से चमकाने के लिए केवल प्रदर्शन को टैप करने में सक्षम होना चाहिए। तो गतिविधि को एक सक्रिय राज्य में रहना है।

एक समान प्रश्न पूछा गया है here

चूंकि यह प्रश्न लगभग एक वर्ष पुराना है, इसलिए मुझे उम्मीद है कि शायद किसी ने इस समय में इसका प्रबंधन किया है।

बधाई

Siggy

+0

क्या आपने [PowerManager'] (http://developer.android.com/reference/android/os/PowerManager.html) की कोशिश की है? इससे आपको स्क्रीन चालू और बंद करने में मदद मिल सकती है। हालांकि मुझे डर है कि यह आपकी गतिविधि को स्पर्श घटनाओं को भी अक्षम कर सकता है। –

+1

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

+0

@ सिंगुल्युलरिटी मैं वर्तमान में 'पावरमैनेजर' और 'वेक लॉक्स' के साथ खेल रहा हूं लेकिन मैं अभी तक सटीक हैंडलिंग हासिल नहीं कर पा रहा हूं। – Siggy

उत्तर

7

यह की तरह लगता है बहुत से सिर्फ प्रदर्शन को छूकर स्क्रीन बंद करने और पुन: सक्रिय करने के लिए संभव नहीं है।

मेरा नया अब दृष्टिकोण:

private WakeLock screenWakeLock; 

PowerManager pm = PowerManager.getSystemService(Context.POWER_SERVICE); 
screenWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
           "screenWakeLock"); 
screenWakeLock.acquire(); 

PARTIAL_WAKE_LOCK सीपीयू चल रहता है, लेकिन प्रदर्शन बंद करने के लिए अनुमति देता है।

जब बिजली या घर बटन दबाया जाता है तो प्रदर्शन फिर से चालू हो जाता है और गतिविधि फिर से दिखाई देती है (बिना "स्लाइड-टू-अनलॉक" या sth।) के बिना।

screenWakeLock जारी करने के लिए मत भूलना।

मेरे मामले में मैं गतिविधि के onResume() में यह किया:

if (screenWakeLock != null) { 
    if(screenWakeLock.isHeld()) 
     screenWakeLock.release(); 
    screenWakeLock = null; 
} 

हो सकता है कि यह भविष्य में इसी तरह की समस्या के साथ किसी मदद करता है।

+1

+1 लेकिन ध्यान दें कि सक्रिय करने वाले लॉक के रूप में हटा दिया गया है एपीआई 13 (यदि आप 13 से कम minSDK निर्दिष्ट करते हैं तो आप अभी भी उच्च संस्करण में इसका उपयोग कर सकते हैं)। – ripopenid

+0

एपीआई के नए संस्करणों में, आपको इसे और अधिक उपयोग करना होगा: 'PowerManager pm = (PowerManager) getBaseContext() प्राप्त करें। सिस्टम सिस्टम (Context.POWER_SERVICE) प्राप्त करें; ' – forresthopkinsa

1

नोट: मैं मैं एक समाधान है जो SCREEN_OFF_TIMEOUT में बदला जाता है लगा Wakelock

के साथ काम करने में सक्षम नहीं था। इसे प्राप्त करने के लिए नीचे कोड का उपयोग करें।

Settings.System.putInt(getContentResolver(), 
          Settings.System.SCREEN_OFF_TIMEOUT, 10); 

यह स्क्रीन-टाइमआउट सिस्टम-वाइड के लिए टाइमआउट के रूप में 10 मिलीसेकंड सेट करता है।

अब आप इस द्वारा लाए गए सिस्टम-वाइड परिवर्तनों से परेशान हो सकते हैं। इसके आसपास काम करने के लिए आप डिफ़ॉल्ट स्क्रीन_टाउटआउट_टाइम प्राप्त कर सकते हैं और इसे एक चर में सहेज सकते हैं और फिर अपनी गतिविधि के समाप्त() पर सिस्टम की SCREEN_OFF_TIMEOUT को वापस सेट कर सकते हैं।

इससे पहले कि हमारी screen_timeout के रूप में स्थापित करने 10ms SCREEN_OFF_TIMEOUT मिलता है,

int defaultScreenTimeout= android.provider.Settings. 
     System.getInt(getContentResolver(),Settings.System.SCREEN_OFF_TIMEOUT,-1); 

अब जब आप अपने परिवर्तन के साथ समाप्त कर दिया है या अपनी गतिविधि आप SCREEN_OFF_TIMEOUT वापस निर्धारित कर सकते हैं समाप्त होता है जब।

@Override 
public void finish(){ 
    Settings.System.putInt(getContentResolver(), 
         Settings.System.SCREEN_OFF_TIMEOUT, defaultScreenTimeout); 
super.finish(); 
}