2016-07-31 7 views
10

कुछ उपकरणों में अतिरिक्त सुरक्षा सुविधाएं हैं और यह जांचें कि अनुमति संवाद दिखाते समय कोई ऐप दूसरों के शीर्ष पर आ रहा है या नहीं।स्क्रीन ओवरले का पता चला - स्क्रीन ओवरले ऐप में इसे कैसे संभालें

मेरे पास एक साइडबार ऐप है, और उपयोगकर्ता को सिस्टम संवाद स्वीकार करने से पहले, मेरे ऐप को अक्षम करना होगा।

प्रश्न

  • मैं कैसे इस मामले को संभालने के लिए माना जाता रहा हूँ?
  • क्या "सिस्टम संवाद दिखाया गया" ईवेंट सुनने के लिए कोई तरीका है, ताकि मैं अपनी साइडबार और "सिस्टम संवाद समाप्त कर सकूं" को हटा सकूं ताकि मुझे पता चले कि मैं अपने साइडबार ओवरले के साथ जारी रख सकता हूं? मैं जानता हूँ कि यह है कि यह सेवा (आप अनुमति को दूर करने की जरूरत नहीं है) को रोकने के लिए पर्याप्त है, तो यह एक समाधान हो सकता है और साथ ही

संपादित

एक समाधान मैं के बारे में सोच सकते हैं निम्नलिखित है:

वर्तमान अग्रभूमि ऐप्स/दृश्यों की जांच के लिए AccessibilityService का उपयोग करना। वहाँ मैं घटनाओं कि मुझे दिखाने के वर्तमान अग्रभूमि गतिविधियों और यहां तक ​​कि विचारों की जाँच करने में सक्षम हो जाएगा ...

मेरे समस्याओं:

  • मैं कैसे एक अनुमति वहाँ संवाद पहचान करने के लिए पता नहीं है।
  • दूसरा, यह मुझे उपयोगकर्ता को यह अनुमति प्राप्त करने के लिए कहता है (जिसे मैं टालना चाहता हूं, लेकिन इस सेवा के साथ समाधान होने से पहले ही मेरे लिए एक सुधार होगा, क्योंकि कुछ उपयोगकर्ता पहले से ही मेरे ऐप को यह अनुमति देते हैं - मुझे तब सब कुछ पूछना होगा और कारण बताएं, जो कुछ मैं रह सकता हूं)।

उत्तर

0

जहाँ तक मुझे पता है, आप जो चाहते हैं वह संभव नहीं है। इसी तरह के question में, सिस्टम संवाद का पता लगाने का एक समाधान है, लेकिन मुझे नहीं लगता कि यह आपके ओवरले के लिए काम करेगा (केवल वर्तमान गतिविधि के लिए)।

एक और question सुझाव देता है कि ActivityManager कक्षा के माध्यम से सिस्टम संवादों की निगरानी करना संभव हो सकता है, लेकिन उस API को LOLIPOP के बाद से हटा दिया गया है।

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


सिस्टम एप्लिकेशन की पहचान करने के लिए, के रूप में this answer में विस्तार से बताया पैकेज का नाम की जरूरत है:

public boolean isSystemApp(String packageName) { 
    try { 
     // Get packageinfo for target application 
     PackageInfo targetPkgInfo = mPackageManager.getPackageInfo(
       packageName, PackageManager.GET_SIGNATURES); 
     // Get packageinfo for system package 
     PackageInfo sys = mPackageManager.getPackageInfo(
       "android", PackageManager.GET_SIGNATURES); 
     // Match both packageinfo for there signatures 
     return (targetPkgInfo != null && targetPkgInfo.signatures != null && sys.signatures[0] 
       .equals(targetPkgInfo.signatures[0])); 
    } catch (PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 
+0

मैं लिंक ... मेरी एप्लिकेशन को स्वयं कभी कभी पहले से ही रुक जाता है की जांच करेंगे, कुछ उपयोगकर्ता चयनित जब काली सूची में डाला ऐप्स अग्रभूमि में हैं, इसलिए मैं इसे 'गतिविधि प्रबंधक' (या नई 'पहुंच-योग्यता सेवा') के माध्यम से पहले से ही देखता हूं ... मैंने सोचा कि 'AccessibilityService' कम से कम कोई समाधान हो सकता है ... – prom85

+0

@ prom85 हां, यह [AccessibilityService # getWindows()] के साथ भी संभव हो सकता है (https://developer.android.com/reference/android/accessi bilityservice/AccessibilityService।एचटीएमएल # getWindows()), जो प्रलेखन के अनुसार सभी विंडो दिखाता है। – Manu

+0

मेरे पास अधिसूचना में पहले से ही एक विराम/फिर से शुरू बटन है ... और वर्तमान अग्रभूमि ऐप/दृश्य प्राप्त करना कोई समस्या नहीं है, फिर भी, मुझे नहीं पता कि सिस्टम विंडो की पहचान कैसे करें ... मैंने कुछ अतिरिक्त इन्फोस जोड़े हैं मेरा प्रश्न 'पहुंच-योग्यता सेवा' समाधान से संबंधित है ... – prom85

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