Der Barrierefreiheitsdienst in Android wird immer wieder deaktiviertJava

Java-Forum
Guest
 Der Barrierefreiheitsdienst in Android wird immer wieder deaktiviert

Post by Guest »

Ich habe eine Android-Anwendung entwickelt, die auf einem Barrierefreiheitsdienst basiert. Aber ich habe ein Problem und kann im Internet keine Hilfe finden. Wenn ich die Anwendung auf einem beliebigen Gerät installiere, funktioniert sie offensichtlich erst, wenn:
  • Ich gehe zu den Barrierefreiheitseinstellungen
  • Suchen Sie den Eingabehilfedienst
  • Geben Sie ihn ein und drücken Sie den Schalter, um den Dienst einzuschalten
Das Problem ist etwas komplex:
Nachdem ich den Barrierefreiheitsdienst aktiviert habe, kann ich hineinsehen Auf dem Bildschirm mit den Barrierefreiheitseinstellungen wird angezeigt, dass der Dienst „aktiviert“ anzeigt. Tatsächlich funktioniert die Anwendung. Aber wenn ich dann den Dienst betrete, gibt es oben und rechts einen Schalter, der als AUS angezeigt wird. Warum? Es macht keinen Sinn, dass der Dienst aktiviert ist und funktioniert und der Schalter als AUS angezeigt wird.

Ich habe es mit einem anderen Dienst wie Talkback versucht, der integriert ist. Wenn ich den Schalter einschalte, zurück zum Bildschirm mit den Barrierefreiheitseinstellungen gehe und dann erneut den Talkback-Dienst aufrufe, bleibt der Schalter eingeschaltet. Warum funktioniert es mit meinem Dienst nicht ordnungsgemäß?

Ich erkläre noch einmal, dass meine Anwendung zwar nicht ordnungsgemäß für meinen Dienst funktioniert, meine Anwendung jedoch tatsächlich funktioniert. Das einzige Problem ist dieser Schalter, der den Benutzer verwirrt, wenn er AUS anzeigt, obwohl mein Dienst bereits eingeschaltet ist.

Gibt es einen Grund, warum dies passieren könnte? Vielleicht habe ich so etwas übersehen, wie etwa dem System mitzuteilen, wann der Dienst aktiviert wird, oder so etwas?

Mein Code des Dienstes weist nichts Ungewöhnliches auf und ähnelt jedem anderen Barrierefreiheitsdienst, außer für meine benutzerdefinierten Vorgänge, wenn ein Ereignis eintritt.

Hier ist die Manifest-XML-Datei der Anwendung:

Code: Select all















































































Das Manifest deklariert den Barrierefreiheitsdienst und verweist auf die folgende Konfigurationsdatei:
Hier ist der Code der Java-Klasse, die den Barrierefreiheitsdienst implementiert:

Code: Select all

package bembibre.attractive.events;

import java.util.ArrayList;
import java.util.List;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.os.Build;
import android.view.accessibility.AccessibilityEvent;
import android.widget.RemoteViews;
import bembibre.attractive.events.wakelocks.CpuLockTask;
import bembibre.attractive.events.wakelocks.DeleteAllWhatsAppDataCpuLockTask;
import bembibre.attractive.events.wakelocks.MissedCallsChangedCpuLockTask;
import bembibre.attractive.events.wakelocks.SmsChangedCpuLockTask;
import bembibre.attractive.events.wakelocks.UpdateWhatsAppDataCpuLockTask;
import bembibre.attractive.logging.Logger;
import bembibre.attractive.logic.ApplicationPackages;
import bembibre.attractive.logic.whatsapp.WhatsAppNotificationContent;
import bembibre.attractive.logic.whatsapp.WhatsAppNotificationExtractionStrategy;
import bembibre.attractive.utils.AppUtils;
import bembibre.attractive.utils.ArrayUtils;

/**
* Clase que representa un servicio que debe estar activo todo el tiempo para que el widget de notificaciones funcione
* correctamente. Este servicio se encarga de capturar distintos eventos que hacen que aparezcan datos en el widget.
*
* @author misines
*
*/
public class EventsAccessibilityService extends AccessibilityService {

private static final List OPEN_WINDOW_EVENTS = new ArrayList();

private static final List STRATEGIES = new ArrayList();
static {
/*
* Añadimos las estrategias para la extracción de contenido de notificaciones de WhatsApp.
*/
// Aún no dispongo de las estrategias necesarias...
}

@SuppressLint("InlinedApi")
@Override
public void onServiceConnected() {
AccessibilityServiceInfo info = new AccessibilityServiceInfo();

OPEN_WINDOW_EVENTS.add(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
OPEN_WINDOW_EVENTS.add(AccessibilityEvent.TYPE_VIEW_FOCUSED);
// if (Build.VERSION.SDK_INT >= 14) {
// OPEN_WINDOW_EVENTS.add(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
// OPEN_WINDOW_EVENTS.add(AccessibilityEvent.TYPE_VIEW_SCROLLED);
// }
// else {
// OPEN_WINDOW_EVENTS.add(2048);
// OPEN_WINDOW_EVENTS.add(4096);
// }

// Set the type of events that this service wants to listen to.  Others
// won't be passed to this service.
int eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
for (Integer openWindowEvent : OPEN_WINDOW_EVENTS) {
eventTypes = eventTypes | openWindowEvent;
}
info.eventTypes = eventTypes;

// If you only want this service to work with specific applications, set their
// package names here. Otherwise, when the service is activated, it will listen
// to events from all applications.
info.packageNames = ApplicationPackages.getMergedPackages(ApplicationPackages.PKG_WHATSAPP,
ApplicationPackages.PKG_CALLS, ApplicationPackages.PKG_SMS);

// Set the type of feedback your service will provide.
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_VISUAL;

// Default services are invoked only if no package-specific ones are present
// for the type of AccessibilityEvent generated. This service *is*
// application-specific, so the flag isn't necessary.  If this was a
// general-purpose service, it would be worth considering setting the
// DEFAULT flag.

// info.flags = AccessibilityServiceInfo.DEFAULT;

info.notificationTimeout = 100;

this.setServiceInfo(info);

}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
String packageName = event.getPackageName().toString();
Logger.log("Evento de accesibilidad detectado de tipo: " + Integer.valueOf(eventType).toString()
+ ", aplicación: " + packageName);
if (isOpenWindowEvent(eventType)) {
if (ArrayUtils.containsIgnoreCase(ApplicationPackages.PKG_WHATSAPP, packageName)) {
Logger.log("Se ha abierto la aplicación WhatsApp");
CpuLockTask.execute(this, DeleteAllWhatsAppDataCpuLockTask.class);
}

/*
* En llamadas y mensajes tenemos que introducir un retardo porque sino suele pasar que la recolección de
* datos se produce antes de que el sistema haya marcado las llamadas y mensajes como leídos.
*/
if (ArrayUtils.containsIgnoreCase(ApplicationPackages.PKG_CALLS, packageName)) {
Logger.log("Se ha abierto la aplicación de las llamadas.");
CpuLockTask.execute(this, MissedCallsChangedCpuLockTask.class, AppUtils.SLEEP_BEFORE_RECOLLECTION);
}
if (ArrayUtils.containsIgnoreCase(ApplicationPackages.PKG_SMS, packageName)) {
Logger.log("Se ha abierto la aplicación de los SMSs.");
CpuLockTask.execute(this, SmsChangedCpuLockTask.class, AppUtils.SLEEP_BEFORE_RECOLLECTION);
}
}
if (((ArrayUtils.containsIgnoreCase(ApplicationPackages.PKG_WHATSAPP, packageName)) && (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED))) {
this.processWhatsAppNotificacion(event);
}
}

@Override
public void onInterrupt() {

}

private boolean isOpenWindowEvent(int event) {
boolean result;
if (OPEN_WINDOW_EVENTS.contains(event)) {
result = true;
} else {
result = false;
}
return result;
}

@SuppressLint("NewApi")
private void processWhatsAppNotificacion(AccessibilityEvent event) {
Notification notification;
try {
notification = ((Notification) event.getParcelableData());
} catch (ClassCastException e) {
notification = null;
}
if (notification == null) {
Logger.log("Se ha recibido una notificación de WhatsApp pero no es de clase \"Notification\" o está vacía.");
} else {
WhatsAppNotificationContent content = null;
int index = 1;
for (WhatsAppNotificationExtractionStrategy strategy : STRATEGIES) {
content = strategy.extract(notification);
if (content != null) {
Logger.log("Éxito en estrategia de extracción " + index + ".");
break;
}
index++;
}
if (content == null) {
Logger.log("Se ha recibido una notificación de WhatsApp pero la vista está vacía o ninguna de las estrategias de extracción han funcionado.");
} else {
Logger.log("Se ha recibido una notificación de WhatsApp analizable.");
CpuLockTask.execute(this, UpdateWhatsAppDataCpuLockTask.class, 0, content);
}
}
}
}
Es tut mir so leid, dass die Kommentare des Codes auf Spanisch sind. Das liegt daran, dass es meine Muttersprache ist.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post