2011-07-15 23 views
58

मैं सोच रहा हूं कि स्वाइपपैड और वेव लॉन्चर जैसे ऐप्स कैसे सेवा के माध्यम से स्पर्श संकेत/घटनाओं का पता लगाने में सक्षम हैं। ये ऐप्स टच जेस्चर का पता लगाने में सक्षम हैं, भले ही यह अपनी गतिविधि में न हो। मैंने पूरे इंटरनेट पर देखा है और नहीं मिला है कि वे यह कैसे कर सकते हैं।सेवा स्पर्श स्पर्श/घटनाओं के लिए कैसे सुन सकती है?

मेरा मुख्य प्रश्न यह है कि एक नियमित गतिविधि के रूप में एक नियमित गतिविधि मोशनवेन्ट्स प्राप्त हो सकती है, भले ही यह मूल गतिविधि या संदर्भ में न हो, तो स्पर्श सेवा/घटनाओं पर एक सेवा कैसे सुन सकती है। मैं अनिवार्य रूप से एक ऐप बनाने की कोशिश कर रहा हूं जो किसी उपयोगकर्ता से एक विशेष स्पर्श इशारा को फिर से स्थापित करेगा, भले ही गतिविधि शीर्ष पर है और उस इशारा को फिर से भरने पर कुछ करें। टच रिकॉन्शन पृष्ठभूमि में एक थ्रेड होगा जो एक सेवा के रूप में पृष्ठभूमि में चल रहा है।

+1

SwipePad यह की तरह लग रहा है पूरी स्क्रीन के बजाय स्पर्श करने योग्य क्षेत्रों के लिए पारदर्शी सिस्टम अलर्ट विंडो का उपयोग कर सकते हैं। – Sam

उत्तर

5

दिलचस्प सवाल। मुझे नहीं पता कि उन्होंने ऐसा कैसे किया और मुझे Google समूह पोस्ट मिले जो मुझे बताते हैं कि कोई वैश्विक स्पर्श श्रोता नहीं है। लेकिन मेरे पास कोई विचार है ...

मुझे this post मिला जहां कोई सेवा से पॉपअपविंडो प्रदर्शित करने में सफल होता है। अगर मैं उस पॉपअप पारदर्शी और पूर्णस्क्रीन को बनाउंगा, तो मुझे यकीन है कि मैं स्पर्श को पकड़ सकता हूं क्योंकि मुझे touch interceptor सेट करने की अनुमति है।

संपादित: परिणामों की रिपोर्ट करें जब आप की कोशिश है कि, जानना चाहते हैं कि यह काम करता है दिलचस्प होगा ...

+0

यह एक दिलचस्प तरीका की तरह लगता है। मैंने पॉपअपविंडोज को समान चीजों के लिए पहले इस्तेमाल किया है लेकिन मुझे इसे आज़मा देना होगा। फिलहाल, मैं निराश हूं कि सेवा से स्पर्श घटनाओं को प्राप्त करना कितना मुश्किल है। इससे पहले कि मैं इसे आजमाने का मौका पाउंगा, लेकिन मैं आपको बता दूंगा कि यह कैसा चल रहा है! – Brian

+0

मैंने अभी यह कोशिश की, और मुझे दिखाने के लिए चेतावनी संवाद भी नहीं मिला। 'शो' विधि ने 'BadTokenException' फेंक दिया। – Sam

+0

अपवाद संदेश 'विंडो जोड़ने में असमर्थ है - टोकन नल मान्य नहीं है; क्या आपकी गतिविधि चल रही है? ' – Sam

18

मैं इस एक ही समस्या थी और मैं अंत में यह समझ से बाहर है! इस पोस्ट के लिए धन्यवाद: Creating a system overlay window (always on top)। आप (और यह भी मतलब है कि आप Andoid आईसीएस में उपयोग कर सकते हैं) एक उपरिशायी के बजाय एक चेतावनी विंडो का उपयोग करने की जरूरत है:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
       PixelFormat.TRANSLUCENT); 

तो बस इस तरह से एक GestureListener देते हैं:

GestureDetector gestureDetector = new GestureDetector(this, new AwesomeGestureListener()); 
View.OnTouchListener gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      return gestureDetector.onTouchEvent(event); 
     } 
}; 

overlayView.setOnTouchListener(gestureListener); 

आहा!

+0

क्या यह उन गतिविधियों में बटन क्लिक करने की क्षमता में हस्तक्षेप करेगा, जो वे सोचते हैं कि वे – ChuckKelly

+0

@ChuckKelly हां यह –

+3

हस्तक्षेप करेंगे मैं सेवा से नलियां सुनने की कोशिश कर रहा हूं, सेवा एक गतिविधि से जुड़ी है। गतिविधि सामान्य के रूप में प्रयोग की जाती है लेकिन सेवा रिकॉर्डिंग नल रखती है। जब TYPE_SYSTEM_OVERLAY का उपयोग करते हैं तो यह एंड्रॉइड 2.3 पर बहुत अच्छा काम करता है लेकिन 4.1 पर ऑन टचवेन्ट नहीं लगाया जाता है। TYPE_SYSTEM_ALERT ऑन टचइवेंट का उपयोग करते समय उपयोग किया जाता है लेकिन स्पर्श ईवेंट गतिविधि को पास नहीं किया जाता है, और यह अनुत्तरदायी हो जाता है। कृपया –

2

मैंने हर संभव समाधान का परीक्षण किया लेकिन कुछ भी काम नहीं किया, कुछ ने टच इवेंट नहीं निकाल दिया जिसने स्क्रीन को जमे हुए।

तो मैंने किया था कुछ रिवर्स इंजीनियरिंग और समाधान अभी पोस्ट करना जो काम करता है

WindowManager.LayoutParams params = new android.view.WindowManager.LayoutParams(0, 0, 0, 0, 2003, 0x40028, -3); 
     View mView = new View(this); 

     mView.setOnTouchListener(this); 

     WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     wm.addView(mView, params); 
+0

पर काम नहीं कर रहा प्रतीत होता है यह केवल पहले दृश्य/गतिविधि के लिए काम कर रहा है। बनाई गई गतिविधियों के लिए नहीं। मुझे निम्नलिखित चेतावनी मिलती है: डब्ल्यू/व्यू रूट Impl: कोई खिड़की फोकस के कारण घटना को छोड़ना: मोशनवेन्ट {action = ACTION_OUTSIDE, actionButton = 0, id [0] = 0, x [0] = 0.0, y [0] = 0.0, टूल टाइप [0] = TOOL_TYPE_FINGER, बटनस्टेट = 0, मेटास्टेट = 0, झंडे = 0x0, एजफ्लैग = 0x0, पॉइंटरकाउंट = 1, इतिहास आकार = 0, ईवेंटटाइम = 220247332, डाउनटाइम = 220247332, डिवाइसआईडी = 4, स्रोत = 0x1002} –

3

मैं एपीआई 21 और एक गठजोड़ 5 पर इस परीक्षण किया है और मैं एक सेवा, से प्रवेश करने के लिए, सक्षम था जब एक स्पर्श घटना निकाल दिया गया था प्रणाली द्वारा हालांकि, मोशनएवेंट ऑब्जेक्ट के अंदर डेटा, उदाहरण के लिए निर्देशांक, 0.0 के बाद आता है जब मेरे ऐप के पैकेज के बारे में क्या लगता है।

दो स्रोतों integration, permission

मैं क्यों event.getX(), event.getY() और event.getPressure() 0.0 लौटने जब एप्लिकेशन की गतिविधि में नहीं के रूप में उत्सुक हूँ जहां सेवा रहता है।

संपादित

यह समाधान

public boolean onTouch(View v, MotionEvent e){ 
    Log.d(LOG_TAG, "Touch event captured"); 
    return false;  

की वजह से सेवा द्वारा capured स्पर्श घटना झूठी लौटने तक प्राप्त करने से अन्य श्रोताओं को नहीं रोकता है, यह अन्य श्रोताओं घटना प्राप्त करने के लिए अनुमति देता है।

EDIT2

जाहिर है, ओएस 0 निर्देशांक और दबाव सेट हो जाएगा यदि वर्तमान गतिविधि और श्रोता एक यूआईडी का हिस्सा नहीं है में इनपुट डिस्पैचर, यहाँ source

+0

क्या आप देखते हैं इस के आसपास काम करने का एक तरीका? यूआईडी गतिशील रूप से बदलने की तरह? – keinabel

+0

जब तक कि आपका अपना ओएस न हो, मुझे नहीं लगता कि यह संभव होगा। शायद अगर सेवा सिस्टम सेवा के रूप में पंजीकृत है? मेरा मतलब है कि मूल्य वहां हैं लेकिन ओएस ब्याज के मूल्यों को हटा देगा और किसी भी अन्य श्रोताओं तक टच इवेंट को प्रचारित करेगा। – Clocker

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

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