2016-05-30 19 views
1

Ich habe eine Android-Anwendung entwickelt, die auf einem Accessibility-Service basiert. Aber ich habe ein Problem und kann keine Hilfe im Internet finden. Wenn ich die Anwendung auf jedem Gerät zu installieren, offenbar startet erst arbeiten:Accessibility Service in Android wird immer deaktiviert

  1. ich Zugänglichkeit Einstellungen gehen
  2. seine Zugänglichkeit Service
  3. in sie eingehen finden und den Schalter drücken, um die Schaltfläche Service auf

das Problem ist ein wenig komplex: Nachdem ich die Zugänglichkeit Dienst aktiviert haben, ich in der Zugänglichkeit Einstellungen sehen Bildschirm, dass der Dienst sagt „freigegeben“. Tatsächlich funktioniert die Anwendung. Aber wenn ich den Dienst betrete, gibt es einen Schalter oben und rechts, der als AUS angezeigt wird. Warum? Es hat keinen Sinn, dass der Dienst aktiviert ist und funktioniert und der Schalter als AUS angezeigt wird.

Ich habe mit anderen Diensten als Talkback versucht, die eingebaut kommt. Wenn ich den Schalter einschalte, gehe zurück zum Eingabehilfebildschirm und dann erneut in den Talkback-Dienst, der Schalter bleibt eingeschaltet. Warum funktioniert es nicht richtig mit meinem Service?

Nochmals, ich erkläre, dass, obwohl der Aktivierungsschalter für meinen Dienst nicht richtig funktioniert, meine Anwendung in der Tat funktioniert, das einzige Problem ist, dass Schalter, der den Benutzer verwechselt zeigt OFF, wenn mein Dienst bereits eingeschaltet ist.

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

Mein Code des Dienstes hat nichts Ungewöhnliches, ist ähnlich wie jeder andere Zugänglichkeitsdienst außer meinen benutzerdefinierten Operationen, wenn ein Ereignis aufkommt.

Hier ist die Manifest XML-Datei der Anwendung:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="bembibre.attractive" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="21" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> 
    <uses-permission android:name="android.permission.READ_CALENDAR" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.READ_CALL_LOG" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 
    <uses-permission android:name="android.permission.READ_SMS" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="bembibre.attractive.activities.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="bembibre.attractive.activities.HelpActivity" > 
     </activity> 
     <activity android:name="bembibre.attractive.activities.NotesActivity" > 
     </activity> 

     <!-- BroadCastReceiver's --> 
     <receiver 
      android:name=".NotificationsWidget" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_provider" /> 
     </receiver> 
     <receiver 
      android:name="bembibre.attractive.events.receivers.DateChangedReceiver" 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
       <action android:name="android.intent.action.TIME_SET" /> 
      </intent-filter> 
     </receiver> 
     <receiver android:name="bembibre.attractive.events.scheduling.OnAlarmReceiver" /> 
     <receiver android:name="bembibre.attractive.events.receivers.CalendarChangedReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.PROVIDER_CHANGED" /> 

       <data android:scheme="content" /> 
       <data android:host="com.android.calendar" /> 
      </intent-filter> 
     </receiver> 
     <receiver 
      android:name="bembibre.attractive.events.receivers.MissedCallsChangedReceiver" 
      android:enabled="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" /> 
      </intent-filter> 
     </receiver> 
     <receiver android:name="bembibre.attractive.events.receivers.SmsReceiver" > 
      <intent-filter android:priority="500" > 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 

     <!-- Servicios --> 
     <service android:name="bembibre.attractive.ui.WidgetPaintingService" /> 
     <service android:name="bembibre.attractive.events.wakelocks.DateChangedCpuLockTask" /> 
     <service android:name="bembibre.attractive.events.wakelocks.UpdateWhatsAppDataCpuLockTask" /> 
     <service android:name="bembibre.attractive.events.wakelocks.CalendarChangedCpuLockTask" /> 
     <service android:name="bembibre.attractive.events.wakelocks.MissedCallsChangedCpuLockTask" /> 
     <service android:name="bembibre.attractive.events.wakelocks.SmsChangedCpuLockTask" /> 
     <service android:name="bembibre.attractive.events.wakelocks.UpdateAllDataCpuLockTask" /> 
     <service 
      android:name="bembibre.attractive.events.EventsAccessibilityService" 
      android:label="@string/accessibility_service_label" 
      android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > 
      <meta-data 
       android:name="android.accessibilityservice" 
       android:resource="@xml/accessibility_service_config" /> 

      <intent-filter> 
       <action android:name="android.accessibilityservice.AccessibilityService" /> 
      </intent-filter> 
     </service> 
    </application> 
</manifest> 

Das Manifest der Zugänglichkeit Service erklärt, und es bezieht sich auf die folgende Konfigurationsdatei:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
    android:description="@string/accessibility_service_description" 
/> 

Hier ist der Code der Java-Klasse, implementiert den Zugänglichkeitsdienst:

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<Integer> OPEN_WINDOW_EVENTS = new ArrayList<Integer>(); 

    private static final List<WhatsAppNotificationExtractionStrategy> STRATEGIES = new ArrayList<WhatsAppNotificationExtractionStrategy>(); 
    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 ist so, weil es meine Muttersprache ist.

+0

Bitte geben Sie Ihren Code ein. – Lampard

+0

Ich habe meinen Code veröffentlicht. Glaubst du, dass etwas übersehen wurde? Ich habe es aus einem Beispiel auf der Android-Entwickler-Website erstellt. – user3289695

Antwort

0

es mit Greenify auf einer Xiaomi Redmi Anmerkung 3 (Eibisch) mit mir geschieht,

I tat

Settings->apps setting->permissions-> autostart

und ermöglicht Greenify. Es hat für mich funktioniert.

0

In meinem Fall oppo f1s, i eine Lösung Zu allererst Ihrem Gerät verwurzelt die beste Art und Weise zu tun, dass herausgefunden, ist durch das Zurücksetzen Firmware auf Werk oder Aktualisierung auf neuere oppo Systemabbilds werden soll, dann benutzerdefinierte Installation Recovery BIOS oder was auch immer es heißt, ist dann im Recovery-Modus mit Magisc ... rooting All dies ist in einigen xda-developers forum topic beschrieben. Aber das ist nicht unser Problem für jetzt, Um Zugänglichkeitserlaubnis von unserem Service oder App zu widerrufen, müssen wir Entwickler gehen, durch Browsen EINSTELLUNGEN >> GERÄTE INFO, dann klicken Sie etwa 8 mal oder mehr auf BUIL NUMBER ... jetzt, da wir für immer DEVELOPER geworden sind, gehen wir zurück und dann navigieren wir in Richtung EINSTELLUNGEN >> ERWEITERTE EINSTELLUNGEN >> ENTWICKLEREINSTELLUNGEN ... dann aktivieren ENTWICKELUNGSOPTIONEN, öffnen Sie den Abschnitt LAUFEND SERVICES, suchen Sie nach Anwendung namens SECURITY CENTER , innerhalb dessen wir 4 laufende Dienste sehen können, dann STOP-Dienst namens CONTROL_VERIFY_SERVICE (natürlich auf eigene Gefahr) , das ist es, gehen Sie jetzt zu EINSTELLUNGEN >> ERWEITERTE EINSTELLUNGEN >> ZUGÄNGLICHKEIT und aktivieren Sie die Zugänglichkeit für Ihre Anwendung und genießen es .....

+0

Das sieht nach einer soliden Antwort aus, aber es könnte etwas Formatierung erfordern (nummerierte Schritte oder Aufzählungszeichen usw.) – C8H10N4O2