2010-09-01 13 views
6

मुझे वेक लॉक प्राप्त करने में कोई समस्या है। ऐसा लगता है कि काम नहीं करना है। मैं एक FULL_WAKE_LOCK प्राप्त करने का प्रयास कर रहा हूं लेकिन न तो डिस्प्ले सक्षम हो गया है और न ही मेरा ऐप कार्य करने में सक्षम है। android.permission.WAKE_LOCKएंड्रॉइड वेक लॉक

मेरे अधिग्रहण कोड इस तरह दिखता है:

PowerManager pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag"); 
wl.acquire(); 

क्या मैं गलत कर रहा हूँ

मैं निम्नलिखित अनुमति उपयोग कर रहा हूँ?

संपादित करें: एक और झंडा ACQUIRE_CAUSES_WAKEUP गया ... लेकिन व्यवहार

EDIT2 में कोई बदलाव नहीं: सभी मुझे क्या करना कोशिश कर रहा हूँ संगीत खेलने के लिए और एक निश्चित घटना पर मेरे डिवाइस को जगाने के लिए, है। संगीत सही ढंग से काम कर रहा है लेकिन डिवाइस काला रहता है।

उत्तर

1

आप वेक लॉक कहां प्राप्त कर रहे हैं? आपको इरादे के प्राप्तकर्ता में इसे प्राप्त करने की आवश्यकता होगी, न कि आपके इरादे से शुरू होने वाली सेवा/गतिविधि में।

+0

मैं एक anctivity में यह प्राप्त कर रहा हूँ क्योंकि मैं एक गतिविधि रिसीवर – Coxer

+0

के रूप में स्थापित मुझे यकीन है कि मुझे समझ में नहीं कर रहा हूँ है। एक गतिविधि ब्रॉडकास्ट रिसीवर नहीं हो सकती है क्योंकि ब्रॉडकास्ट रिसीवर एक अमूर्त वर्ग नहीं है जो इंटरफ़ेस नहीं है (जावा में एकाधिक विरासत नहीं है)। क्या आपका मतलब है कि आपके पास गतिविधि वर्ग पर एक निजी स्थिर ब्रॉडकास्ट रिसीवर है? मैं बस इतना कह रहा हूं कि आपको ब्रॉडकास्ट रिसीवर में जागरूक लॉक को उस सेवा से शुरू करने वाली गतिविधि के क्रिएट() में नहीं लेना चाहिए। –

7

वेक लॉक स्क्रीन को रखने का एक अक्षम तरीका है। जादू करने के लिए WindowManager का उपयोग करें। निम्नलिखित एक पंक्ति WakeLock पर्याप्त होगा। काम करने के लिए वेक लॉक अनुमति भी आवश्यक है। यह कोड wakeLock से भी यह कोड कुशल है।

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

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

लेकिन तुम झंडा रिलीज़ करना चाहते है, तो आप इसके साथ कर सकते हैं:

getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 
+0

मेरे परीक्षणों में, यह केवल तभी काम करता है जब आप गतिविधि की ऑनक्रेट विधि में इसे कॉल करते हैं। जैसे यदि आप ऑन्रेट में FLAG_KEEP_SCREEN_ON जोड़ते हैं तो बाद में इसे हटाने का प्रयास करें, इसका कोई प्रभाव नहीं है, और इसके विपरीत। आईसीएस 4.0.3 –

+0

पर परीक्षण किया गया है आप इसे कहीं भी उपयोग कर सकते हैं। आपको संदर्भ का उपयोग करने की आवश्यकता है। –

3
private static PowerManager.WakeLock lockStatic = null; 
private static String LOCK_NAME_STATIC = "MyWakeLock"; 

public static void acquireStaticLock(Context context) { 
    getLock(context).acquire(); 
} 

synchronized private static PowerManager.WakeLock getLock(Context context) { 
    if (lockStatic == null) { 
     PowerManager mgr = (PowerManager) context 
       .getSystemService(Context.POWER_SERVICE); 
     lockStatic = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, 
       LOCK_NAME_STATIC); 
     lockStatic.setReferenceCounted(true); 
    } 

    return (lockStatic); 
} 

उपयोग:

कॉल acquireStaticLock() जब आप लॉक

acuire करने की जरूरत है

कॉल getLock(this).release(); कॉल के अंदर जब आपको लॉक

जारी करने की आवश्यकता है

इसके अलावा minifest फ़ाइल में अनुमति जोड़ें:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+1

उपरोक्त कोड का उपयोग करने के लिए आपको LOCK_NAME_STATIC को परिभाषित करने की आवश्यकता होगी। जैसे निजी स्थैतिक स्ट्रिंग LOCK_NAME_STATIC = "MyWakeLock"; –

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