Android: как вы проверяете, включен ли определенный AccessibilityService
Я написал приложение для Android, которое требует использования AccessibilityService.
Я знаю, как проверить, включена ли функция "Доступность" или отключена на телефоне, но я не могу найти способ определить, было ли мое приложение специально включено в меню доступности.
Я хочу пригласить пользователя, если AccessibilityService не работает, но не может найти хороший способ сделать это.
Существуют ли какие-либо API-методы, которые могут отсутствовать, что позволит мне узнать, какие службы доступности включены на устройстве?
Ответы
Ответ 1
В конце концов я работал над этим:
public boolean isAccessibilityEnabled(){
int accessibilityEnabled = 0;
final String LIGHTFLOW_ACCESSIBILITY_SERVICE = "com.example.test/com.example.text.ccessibilityService";
boolean accessibilityFound = false;
try {
accessibilityEnabled = Settings.Secure.getInt(this.getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
Log.d(LOGTAG, "ACCESSIBILITY: " + accessibilityEnabled);
} catch (SettingNotFoundException e) {
Log.d(LOGTAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
}
TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
if (accessibilityEnabled==1){
Log.d(LOGTAG, "***ACCESSIBILIY IS ENABLED***: ");
String settingValue = Settings.Secure.getString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
Log.d(LOGTAG, "Setting: " + settingValue);
if (settingValue != null) {
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
splitter.setString(settingValue);
while (splitter.hasNext()) {
String accessabilityService = splitter.next();
Log.d(LOGTAG, "Setting: " + accessabilityService);
if (accessabilityService.equalsIgnoreCase(ACCESSIBILITY_SERVICE_NAME)){
Log.d(LOGTAG, "We've found the correct setting - accessibility is switched on!");
return true;
}
}
}
Log.d(LOGTAG, "***END***");
}
else{
Log.d(LOGTAG, "***ACCESSIBILIY IS DISABLED***");
}
return accessibilityFound;
}
Ответ 2
Начиная с уровня API 14, также можно получить доступные службы доступности через AccessibilityManager:
public static boolean isAccessibilityEnabled(Context context, String id) {
AccessibilityManager am = (AccessibilityManager) context
.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> runningServices = am
.getEnabledAccessibilityServiceList(AccessibilityEvent.TYPES_ALL_MASK);
for (AccessibilityServiceInfo service : runningServices) {
if (id.equals(service.getId())) {
return true;
}
}
return false;
}
Чтобы узнать идентификатор вашей и всех установленных служб доступности, вы можете выполнить следующий фрагмент кода:
public static void logInstalledAccessiblityServices(Context context) {
AccessibilityManager am = (AccessibilityManager) context
.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> runningServices = am
.getInstalledAccessibilityServiceList();
for (AccessibilityServiceInfo service : runningServices) {
Log.i(TAG, service.getId());
}
}
В моем примере идентификатор выглядел как org.your.package/.YourAccessibilityService.
До сих пор метод работал надежно.
Ответ 3
Проверка включенности службы
/**
* Based on {@link com.android.settingslib.accessibility.AccessibilityUtils#getEnabledServicesFromSettings(Context,int)}
* @see <a href="https://github.com/android/platform_frameworks_base/blob/d48e0d44f6676de6fd54fd8a017332edd6a9f096/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java#L55">AccessibilityUtils</a>
*/
public static boolean isAccessibilityServiceEnabled(Context context, Class<?> accessibilityService) {
ComponentName expectedComponentName = new ComponentName(context, accessibilityService);
String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (enabledServicesSetting == null)
return false;
TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');
colonSplitter.setString(enabledServicesSetting);
while (colonSplitter.hasNext()) {
String componentNameString = colonSplitter.next();
ComponentName enabledService = ComponentName.unflattenFromString(componentNameString);
if (enabledService != null && enabledService.equals(expectedComponentName))
return true;
}
return false;
}
Использование:
boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
Обнаружение, когда услуга включена или отключена
Сделайте обратный вызов:
ContentObserver observer = new ContentObserver() {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
boolean accessibilityServiceEnabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
//Do something here
}
};
Подписаться:
Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
context.getContentResolver().registerContentObserver(uri, false, observer);
Отказаться от подписки, когда вы закончите:
context.getContentResolver().unregisterContentObserver(observer);
Обратите внимание, что это не работает с подходом getEnabledAccessibilityServiceList()
, поскольку его значения не синхронизировались с Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
. Вот почему я думаю, что использование Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
- это лучший подход, основанный на одном размере.
Ответ 4
Можете ли вы просто отслеживать, работает ли служба так? Если служба доступности включена, не следует ли ее запускать?
public class MyAccessibilityService extends AccessibilityService{
public static boolean isEnabled = false;
@Override
public void onServiceConnected() {
isEnabled = true;
}
@Override
public void onDestroy(){
isEnabled = false;
}
Ответ 5
Получите идентификатор, когда только началось действие вашей службы активности.
В службе активности OnSeriviceCeonnected после всех вызовов инициализации. Используйте это...
AccessibilityServiceInfo serviceInfo = this.getServiceInfo();
String accessibilityId = serviceInfo.getId();
Требуется Jelly Bean API
Затем вы можете использовать код Мартина (isAccessibilityEnabled), чтобы проверить запущенные службы.
Ответ 6
нужно больше раз
AccessibilityManager am = (AccessibilityManager) context
.getSystemService(Context.ACCESSIBILITY_SERVICE);
Ответ 7
AccessibilityManager accessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> runningservice = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
accessibilityManager.addAccessibilityStateChangeListener(new AccessibilityManager.AccessibilityStateChangeListener() {
@Override
public void onAccessibilityStateChanged(boolean b) {
Toast.makeText(MainActivity.this, "permission "+b, Toast.LENGTH_SHORT).show();
}
});
Listner будет вызываться всякий раз, когда изменяется состояние
вы можете отслеживать логическое значение для проверки разрешения
это, безусловно, самое простое и легкое решение для проверки разрешения