2011-03-07 7 views
9

मैं टाइम विलंब वीडियो प्रभाव बनाने के लिए समय-समय पर एंड्रॉइड डिवाइस के कैमरे से तस्वीरें लेना चाहता हूं।एंड्रॉइड - मैं एक तस्वीर लेने के लिए एक कठिन नींद से फोन कैसे जगा सकता हूं?

मैंने अलार्म प्रबंधक के साथ एक अलार्म प्रबंधक सेट किया है। आरटीसी_WAKEUP ध्वज प्रत्येक कुछ मिनट में सेवा शुरू करने के लिए सेट है।

सेवा में आंशिक वाकेलॉक होता है, कुछ काम करता है, और फिर अलार्म मैनेजर के माध्यम से ब्रॉडकास्ट रिसीवर को कॉल करता है जो एक गतिविधि शुरू करता है।

गतिविधि बनाई गई है (या फिर से शुरू हो चुकी है), अपने स्वयं के वाकलॉक को चालू करता है, और कैमरा पूर्वावलोकन सतह सेट करता है। एक बार सतह स्थापित हो जाने के बाद SurfaceHolder श्रोता की सतह चेंज() विधि कहा जाता है, जो आखिरकार एक तस्वीर लेता है।

यदि डिवाइस जाग रहा है, तो सब कुछ पूरी तरह से अपेक्षित काम करता है। लेकिन यदि डिवाइस सो गया है, तो गतिविधि की ऑनस्यूम() विधि समाप्त होने के बाद गतिविधि तुरंत रोक दी जाती है। कैमरे की पूर्वावलोकन सतह कभी शुरू नहीं होती है, और कोई तस्वीर कभी नहीं ली जाएगी।

तो सवाल मेरे पास है कर रहे हैं:

  1. वहाँ प्रोग्राम के रूप में फोन को जगाने के लिए कोई तरीका है? मैं भी प्रयोग करके देखें:

    PowerManager powerManager = 
          (PowerManager)this.getSystemService(Context.POWER_SERVICE); 
    powerManager.userActivity(SystemClock.currentThreadTimeMillis(),false); 
    

लेकिन वह फोन जाग नहीं करता है तो यह सो रहा है।

  1. क्या पूर्वावलोकन सतह दृश्य का उपयोग किये बिना तस्वीर लेने का कोई तरीका है?

  2. क्या ऐसी तस्वीर लेने का कोई तरीका है जो असीमित कॉलबैक पर भरोसा नहीं करता है? क्या मैं तस्वीर लेने के लिए क्रियाओं() विधि पर क्रियाओं में सभी कोड डाल सकता हूं?

  3. क्या गतिविधि के ऑनर्यूम() विधि को लंबे समय तक चलने का कोई तरीका है ताकि कैमरे के पूर्वावलोकन में सभी श्रोताओं को प्रारंभ करने और कॉल करने के लिए पर्याप्त समय हो?

मैं wakelocks उपयोग कर रहा हूँ सही ढंग से, और मैं सब अनुमति मैनिफ़ेस्ट फ़ाइल में ठीक से सेट रहा है। मेरी गतिविधि को अतुल्यकालिक श्रोताओं के लिए उचित रूप से काम करने के लिए काफी समय तक जागृत नहीं रखा जाता है।

और इस मुद्दे को परिसर करने के लिए, मैं एंड्रॉइड 1.6 को सबकुछ रखने की कोशिश कर रहा हूं, क्योंकि यह एकमात्र टेस्ट डिवाइस है जिसकी मुझे पहुंच है।

यह निराशाजनक सामान है!

+0

कोई कारण नहीं है कि आप अपनी सेवा में यह सब नहीं कर रहे हैं? –

+0

इस सवाल के बाद से कुछ समय हो गया है, इसलिए मैं 100% निश्चित नहीं हूं। मुझे नहीं लगता कि फोन मुश्किल नींद में चलने पर सेवाएं चलाता है, यही कारण है कि मुझे पहले फोन उठाने के लिए अलार्म मैनेजर का उपयोग करना पड़ा। –

+0

यदि आप सेवा चलाने के लिए प्रबंधन करते हैं (एक तरीका है) - क्या गतिविधि_ में गतिविधि _ में आपके द्वारा किए गए सभी सामानों को करने की आवश्यकता है? कारण अगर मुझे नहीं लगता कि मुझे जवाब मिला है –

उत्तर

8

मुझे अंततः कहीं मिल गया है।

मैं इन दो झंडे

PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP 

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "bbbb"); 
wl.acquire(); 

तब डिवाइस जाग, और कीगार्ड स्क्रीन पर शुरू होता है का उपयोग कर एक wakelock बनाना होगा।

लेकिन एक ही रास्ता मैं कीगार्ड स्क्रीन अतीत हो जाते हैं और एक तस्वीर ले जा सकते हैं गतिविधि की खिड़की पर इन चिह्नों का उपयोग करना है:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN 
    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

लेकिन यह एंड्रॉयड 2.0 के साथ ही उपलब्ध है, और काम नहीं करता है 1.6 में

+0

इस अनुमति को न भूलें <उपयोग-अनुमति एंड्रॉइड: name =" android.permission.WAKE_LOCK "/> – max

0

आप अपने onResume विधि में कुछ इस तरह कर रहे हैं

.... onResume() { 
    .... 
    WakeLock myWakeLock = .....; 
    ... 
} 

यदि हां, तो जैसे ही विधि बाहर निकलता है के रूप में, Wakelock जारी की है, और उपकरण जिस भी यह कर की तरह लगता है करने के लिए स्वतंत्र है (जो नींद में वापस जाने की संभावना है) और आपको कहीं भी कक्षा में वेक लॉक स्टोर करने की आवश्यकता होगी, न कि फ़ंक्शन स्थानीय के रूप में।

+0

मैं ऑनर्यूम() विधि के अंदर wakelock के लिए क्लास वैरिएबल का उपयोग कर रहा हूं: 'PowerManager pm = (PowerManager) getSystemService (Context.POWER_SERVICE) प्राप्त करें; wl = pm.newWakeLock (PowerManager.FULL_WAKE_LOCK, "ActivityWakeLock"); wl.acquire(); ' –

2

तुम भी साथ

KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
km.newKeyguardLock(TAG).disableKeyguard(); 

बशर्ते आप DISABLE_KEYGUARD अनुमति है कीगार्ड स्क्रीन निष्क्रिय कर सकते हैं।

यह एपीआई स्तर 1 के बाद उपलब्ध है।

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

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