चेतावनी: Google Play उल्लंघन
Google ने प्ले स्टोर से ऐप्स को हटाने की धमकी दी है यदि वे गैर-पहुंच उद्देश्यों के लिए पहुंच सेवाओं का उपयोग करते हैं। हालांकि, इस पर पुनर्विचार किया जा रहा है ।
लाभ
- एंड्रॉइड 7.1 (एपीआई 25) के माध्यम से एंड्रॉइड 2.2 (एपीआई 8) में परीक्षण और काम कर रहा है।
- मतदान की आवश्यकता नहीं है
GET_TASKS
अनुमति की आवश्यकता नहीं है ।
नुकसान
- प्रत्येक उपयोगकर्ता को एंड्रॉइड की एक्सेसिबिलिटी सेटिंग्स में सेवा को सक्षम करना होगा।
- यह 100% विश्वसनीय नहीं है। कभी-कभी ईवेंट्स आउट ऑफ ऑर्डर हो जाते हैं।
- सेवा हमेशा चल रही है।
- जब कोई उपयोगकर्ता सक्षम करने का प्रयास करता है
AccessibilityService
, तो वे ठीक बटन नहीं दबा सकते हैं यदि किसी एप्लिकेशन ने स्क्रीन पर ओवरले रखा है। ऐसा करने वाले कुछ ऐप वेलिस ऑटो ब्राइटनेस और लक्स हैं। यह भ्रामक हो सकता है क्योंकि उपयोगकर्ता यह नहीं जान सकते हैं कि वे बटन क्यों नहीं दबा सकते हैं या इसके चारों ओर कैसे काम कर सकते हैं।
AccessibilityService
पहले जब तक वर्तमान गतिविधि पता नहीं होगा परिवर्तन गतिविधि की।
उदाहरण
सर्विस
public class WindowChangeDetectingService extends AccessibilityService {
@Override
protected void onServiceConnected() {
super.onServiceConnected();
//Configure these here for compatibility with API 13 and below.
AccessibilityServiceInfo config = new AccessibilityServiceInfo();
config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
if (Build.VERSION.SDK_INT >= 16)
//Just in case this helps
config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
setServiceInfo(config);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
if (event.getPackageName() != null && event.getClassName() != null) {
ComponentName componentName = new ComponentName(
event.getPackageName().toString(),
event.getClassName().toString()
);
ActivityInfo activityInfo = tryGetActivity(componentName);
boolean isActivity = activityInfo != null;
if (isActivity)
Log.i("CurrentActivity", componentName.flattenToShortString());
}
}
}
private ActivityInfo tryGetActivity(ComponentName componentName) {
try {
return getPackageManager().getActivityInfo(componentName, 0);
} catch (PackageManager.NameNotFoundException e) {
return null;
}
}
@Override
public void onInterrupt() {}
}
AndroidManifest.xml
इसे अपनी अभिव्यक्ति में मिलाएं:
<application>
<service
android:label="@string/accessibility_service_name"
android:name=".WindowChangeDetectingService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService"/>
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibilityservice"/>
</service>
</application>
सेवा की जानकारी
इसे इसमें डालें res/xml/accessibilityservice.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!-- These options MUST be specified here in order for the events to be received on first
start in Android 4.1.1 -->
<accessibility-service
xmlns:tools="http://schemas.android.com/tools"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagIncludeNotImportantViews"
android:description="@string/accessibility_service_description"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:ignore="UnusedAttribute"/>
सेवा सक्षम करना
एप्लिकेशन के प्रत्येक उपयोगकर्ता को इसका उपयोग करने के लिए स्पष्ट रूप से सक्षम करने की आवश्यकता होगी AccessibilityService
। यह कैसे करें के लिए यह StackOverflow उत्तर देखें ।
ध्यान दें कि यदि एप्लिकेशन ने स्क्रीन पर ओवरले रखा है, जैसे कि वेलिस ऑटो ब्राइटनेस या लक्स, तो एक्सेसिबिलिटी सर्विस को सक्षम करने का प्रयास करते समय उपयोगकर्ता ओके बटन नहीं दबा पाएगा।