2017-05-05 10 views
11

यह जांचने के लिए कि क्या कोई सिस्टम dialog (जैसा कि नीचे दिया गया है या यूएसएसडी) एंड्रॉइड में प्रदर्शित किया गया है?यह निर्धारित करने के लिए कि कोई सिस्टम संवाद प्रदर्शित होता है या नहीं?

airplane mode switching dialog

प्रोग्रामेटिक रास्ता या cmd जड़ तरीका है? कोई भी प्रकार।

+2

एक "सिस्टम संवाद" किसी अन्य की तरह ही एक गतिविधि है। जादू नहीं है जो एक गतिविधि को "सिस्टम संवाद" बनाता है और दूसरा "सिस्टम संवाद" नहीं करता है। इसलिए, आपको सबसे पहले खुद को तय करना होगा कि "सिस्टम संवाद" और कुछ अन्य संवाद-थीम वाली गतिविधि के बीच विशिष्ट विशेषता क्या है। – CommonsWare

+0

मेरा मतलब है "एयरप्लेन मोड चालू या बंद", या ussd mesage या कुछ ... – Andreyua

उत्तर

2

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

final ActivityManager manager = (ActivityManager) context 
    .getSystemService(Activity.ACTIVITY_SERVICE); 

एपीआई स्तर कम से कम 23 (एम) के साथ उपकरणों में:

final List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(1); 
final ComponentName componentName = runningTasks.get(0).topActivity; 
final String className = componentName.getClassName(); 

if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) { 
    // do something 
} 

अधिक नए डिवाइस में:

final List<ActivityManager.AppTask> appTasks = manager.getAppTasks(); 
final ComponentName componentName = appTasks.get(0).getTaskInfo().topActivity; 
final String className = componentName.getClassName(); 

if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) { 
    // do something 
} 

या इस मामले में, आप देख सकते हैं कि डिवाइस में है गतिविधि शुरू करने से पहले हवाई जहाज मोड:

private boolean isAirplaneModeOn(final Context context) { 
    final int airplaneMode = Settings.System.getInt(
     context.getContentResolver(), 
     Settings.System.AIRPLANE_MODE_ON, 
     0 
    ); 

    return airplaneMode != 0; 
} 

... 

if (!isAirplaneModeOn(this)) { 
    // do something 
} 
+0

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

+0

परीक्षण के लिए मेरे कोड: https://gist.github.com/goodandrewsoft/b961c2b6cfc6666bcbbb2a617f6f8d9e – Andreyua

+0

क्षमा करें, मैंने गलत व्याख्या की। –

3

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

+0

कुछ ऐसा है http://stackoverflow.com/a/32251469/3478155? – Andreyua

2

आपके प्रश्न ने मुझे एंड्रॉइड 6+ में अनुमति प्रबंधन द्वारा उपयोग में आने वाले समाधान के बारे में सोचा। यदि आपने अनुमति सेट करने का प्रयास करते समय टोस्ट या सिस्टम अलर्ट संवाद खोल दिया है तो क्या आपने कभी त्रुटि संदेश देखा है? Android "Screen Overlay Detected" message if user is trying to grant a permission when a notification is showing

तरह वे यह Activity में dispatchTouchEvent विधि अधिभावी कर रहा है था। यह जांच सकता है कि कुछ भी 'रास्ते में' अवरोधक स्पर्श घटनाओं में है या नहीं। आप अपने ऐप में किसी भी गतिविधि के लिए बेस क्लास के रूप में अपनी विशेष गतिविधि का उपयोग कर सकते हैं, जिसे आप किसी भी ओवरले का पता लगाना चाहते हैं।

@Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
     mObscured = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0; 
    return super.dispatchTouchEvent(event); 
} 

किसी भी समय पर जांच करने के लिए एक सार्वजनिक विधि जोड़ें अगर अपनी गतिविधि

public boolean isObscured() { 
    return mObscured; 
} 

आपको सावधान रहना चाहिए अस्पष्ट है - के रूप में यह सवाल से स्पष्ट नहीं है - अगर एक सिस्टम से दूसरे गतिविधि या विशेषाधिकार प्राप्त ऐप स्टैक के सामने है तो आपकी अपनी गतिविधि अब स्पर्श घटनाओं को प्राप्त नहीं करेगी। यह टुकड़े, टोस्ट, फ़्लोटिंग विगेट्स और अन्य सामानों को कैप्चर करना है जो दृश्य पदानुक्रम साझा कर सकते हैं।

+0

दुर्भाग्य से, किटकैट पर काम न करें – Andreyua

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

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