Come fare clic sul button nelle impostazioni utilizzando AccessibilityService?

Voglio fare clic sul button nelle impostazioni android usando AccessibilityService come il greenify ha fatto, ma non riesco a trovare il button specifico. mi aiuti per favore.

MyAccessibilityService .java:

  • ActivityUnitTestCase e startActivity con ActionBarActivity
  • Android: sceglie automaticamente il debug / release Maps chiave api?
  • come impostare solo il valore numbersco per edittext in android?
  • sqlite restituito: codice di errore = 1, msg = vicino "...": errore di syntax
  • Errore di rendering in Editor di layout di Android 3.0
  • Visualizzazione di elenco espandibile personalizzato con filter di ricerca figlio
  • public class MyAccessibilityService extends AccessibilityService { private static final String TAG = MyAccessibilityService.class .getSimpleName(); @Override public void onAccessibilityEvent(AccessibilityEvent event) { Log.i(TAG, "ACC::onAccessibilityEvent: " + event.getEventType()); //TYPE_WINDOW_STATE_CHANGED = 32, if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event.getEventType()) { AccessibilityNodeInfo nodeInfo = event.getSource(); Log.i(TAG, "ACC::onAccessibilityEvent: nodeInfo=" + nodeInfo.getText()); List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByViewId("com.android.settings:id/left_button"); for (AccessibilityNodeInfo node : list) { Log.i(TAG, "ACC::onAccessibilityEvent: " + event.getEventType() + " " + node); } 

    EDIT:

    Solo quando il tipo è TYPE_WINDOW_STATE_CHANGED, potrei get l'object nodeInfo.

  • AccessibilityService è stato avviato ma non riceve AccessibilityEvents su JellyBean
  • Come verificare se Talkback è attivo in JellyBean
  • Impostare il text in AccessibilityNodeInfo
  • Rendere accessibili le applicazioni Android (per le persone con disabilità) con PhoneGap
  • App Android: come leggere la dimensione del carattere in Impostazioni?
  • Android: Come forzare Esplora-By-Touch / Talkback per ripetere il ContentDescription della vista corrente in AccessibilityFocus?
  • 2 Solutions collect form web for “Come fare clic sul button nelle impostazioni utilizzando AccessibilityService?”

    Apri l'appinfo di un'applicazione con il button di chiusura della forza abilitata per verificare:

     public class MyAccessibilityService extends AccessibilityService { private static final String TAG = MyAccessibilityService.class .getSimpleName(); @Override public void onAccessibilityEvent(AccessibilityEvent event) { Log.i(TAG, "ACC::onAccessibilityEvent: " + event.getEventType()); //TYPE_WINDOW_STATE_CHANGED == 32 if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event .getEventType()) { AccessibilityNodeInfo nodeInfo = event.getSource(); Log.i(TAG, "ACC::onAccessibilityEvent: nodeInfo=" + nodeInfo); if (nodeInfo == null) { return; } List<AccessibilityNodeInfo> list = nodeInfo .findAccessibilityNodeInfosByViewId("com.android.settings:id/left_button"); for (AccessibilityNodeInfo node : list) { Log.i(TAG, "ACC::onAccessibilityEvent: left_button " + node); node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } list = nodeInfo .findAccessibilityNodeInfosByViewId("android:id/button1"); for (AccessibilityNodeInfo node : list) { Log.i(TAG, "ACC::onAccessibilityEvent: button1 " + node); node.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } } @Override public void onServiceConnected() { Log.i(TAG, "ACC::onServiceConnected: "); } @Override public void onInterrupt() { // TODO Auto-generated method stub } } 

    La risposta selezionata funziona nell'API 18 e successive da quando si rileva su findAccessibilityNodeInfosByViewId che è stato aggiunto nell'API 18. Ho finito di scrivere questa class per supportre l'API 17 e più in basso.

    ResourcesCompat class ResourcesCompat trova le risorse identificate con la triggerszione specificata che nel nostro caso dovrebbe essere l'attività di impostazione di Android. È ansible get l'attività ComponentName delle impostazioni chiamando questa function quando si gestisce l'evento di accessibilità nel servizio di Accessibilità.

      public static ComponentName getForegroundActivity(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); ComponentName topActivity = taskInfo.get(0).topActivity; return topActivity; } 

    Un buon posto per call init(...) è in onAccessibilityEvent quando si gestisce l'evento TYPE_WINDOW_STATE_CHANGED come descritto in precedenza.

     public class ResourcesCompat { private final static String RESOURCE_TYPE = "string"; private String mResourcesPackageName; private Resources mResources; /** * Find the resource file for a specific activity * * @param context * @param settingsPackageName * @param settingsClassName */ public void init(Context context, String settingsPackageName, String settingsClassName) { try { mResourcesPackageName = settingsPackageName; ComponentName settingsComponentName = new ComponentName(settingsPackageName, settingsPackageName + settingsClassName); mResources = context.getPackageManager().getResourcesForActivity(settingsComponentName); } catch (PackageManager.NameNotFoundException e) { } } /** * Return the localised string for the given resource name. * @param resourceName The name of the resource definition in strings.xml */ public String getString(String resourceName) { int resourceId = getIdentifier(resourceName); return resourceId > 0 ? mResources.getString(resourceId) : null; } /** * Return a resource identifier for the given resource name. * @param resourceName The name of the desired resource. * @return int The associated resource identifier. Returns 0 if no such resource was found. (0 is not a valid resource ID.) */ private int getIdentifier(String resourceName) { return mResources.getIdentifier(resourceName, RESOURCE_TYPE, mResourcesPackageName); } } 

    Alcuni produttori preferiscono spostare le classi e rinominare le stringhe di default ( tosse tosse di Xiomi per tosse di Xiomi). Assicurati di coprire tutti i casi e di gestire errori e eccezioni.

    Infine, trova la tua vista per nome. qui, id può essere ad esempio 'force_stop'

     private List<AccessibilityNodeInfo> findAccessibilityNodeInfosByName(AccessibilityNodeInfo source, String id) { String nodeText = mResourcesCompat.getString(id); if (nodeText != null) { return source.findAccessibilityNodeInfosByText(nodeText); } return null; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.