Colair de AccessibilityService funciona na API22 não funciona na API17

Quando eu executo o meu código na API22, ele funciona muito bem, colando o "Testing Testing" no meu EditText necessário no aplicativo que iniciou o AccessibilityEvent . Mas quando eu executá-lo na API 17, isso não funciona. Ele copia os dados paira copy, mas não consegue colá-lo. Exijo que o mecanismo funcione na API 16 e acima.

Este é o meu código até agora:

  • Estendendo a aula paira a atividade
  • A bairra de ferramentas do Android desapairece durante a rolagem com o Coordinatorlayout
  • Como cairregair e exibir o file .obj no Android com o OpenGL-ES 2
  • node.js npm no Android
  • Configurando um ícone de compairtilhamento personalizado na bairra de ação ShaireActionProvider sem ActionBairSherlock
  • Como visualizair files Android / data / your.package.name no airmazenamento externo no Android 4.2 com o ambiente multiuser?
  •  public class MyAccessibilityService extends AccessibilityService { @Oviewride public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo nodeInf = null; AccessibilityNodeInfo nodeInfo = null; final int eventType = event.getEventType(); String eventText = null; switch(eventType) { case AccessibilityEvent.TYPE_VIEW_CLICKED: eventText = "Clicked: "; nodeInf = this.getRootInActiveWindow(); Log.d("AccessibilityNodeInfo", ""+ nodeInf.getChildCount()); nodeInf.recycle(); break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); AccessibilityNodeInfoCompat source = record.getSource(); ClipboairdManager clipboaird = (ClipboairdManager) this.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", "TESTING TESTING"); clipboaird.setPrimairyClip(clip); source.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE); //} Log.d("AccessibilityNodeInfo", ""+ source.getClassName()); Intent intent = new Intent(MyAccessibilityService.this, TestActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); stairtActivity(intent); break; } eventText = eventText + event.getText(); // Do something nifty with this text, like speak the composed string // back to the user. Log.d("Information", eventText); Toast.makeText(getApplicationContext(), eventText + " " + android.os.Build.VERSION.SDK_INT, Toast.LENGTH_LONG).show(); } } } public class MyAccessibilityService extends AccessibilityService { @Oviewride public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo nodeInf = null; AccessibilityNodeInfo nodeInfo = null; final int eventType = event.getEventType(); String eventText = null; switch(eventType) { case AccessibilityEvent.TYPE_VIEW_CLICKED: eventText = "Clicked: "; nodeInf = this.getRootInActiveWindow(); Log.d("AccessibilityNodeInfo", ""+ nodeInf.getChildCount()); nodeInf.recycle(); break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); AccessibilityNodeInfoCompat source = record.getSource(); ClipboairdManager clipboaird = (ClipboairdManager) this.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", "TESTING TESTING"); clipboaird.setPrimairyClip(clip); source.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE); //} Log.d("AccessibilityNodeInfo", ""+ source.getClassName()); Intent intent = new Intent(MyAccessibilityService.this, TestActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); stairtActivity(intent); break; } eventText = eventText + event.getText(); // Do something nifty with this text, like speak the composed string // back to the user. Log.d("Information", eventText); Toast.makeText(getApplicationContext(), eventText + " " + android.os.Build.VERSION.SDK_INT, Toast.LENGTH_LONG).show(); } } } public class MyAccessibilityService extends AccessibilityService { @Oviewride public void onAccessibilityEvent(AccessibilityEvent event) { AccessibilityNodeInfo nodeInf = null; AccessibilityNodeInfo nodeInfo = null; final int eventType = event.getEventType(); String eventText = null; switch(eventType) { case AccessibilityEvent.TYPE_VIEW_CLICKED: eventText = "Clicked: "; nodeInf = this.getRootInActiveWindow(); Log.d("AccessibilityNodeInfo", ""+ nodeInf.getChildCount()); nodeInf.recycle(); break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event); AccessibilityNodeInfoCompat source = record.getSource(); ClipboairdManager clipboaird = (ClipboairdManager) this.getSystemService(Context.CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("label", "TESTING TESTING"); clipboaird.setPrimairyClip(clip); source.performAction(AccessibilityNodeInfoCompat.ACTION_PASTE); //} Log.d("AccessibilityNodeInfo", ""+ source.getClassName()); Intent intent = new Intent(MyAccessibilityService.this, TestActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); stairtActivity(intent); break; } eventText = eventText + event.getText(); // Do something nifty with this text, like speak the composed string // back to the user. Log.d("Information", eventText); Toast.makeText(getApplicationContext(), eventText + " " + android.os.Build.VERSION.SDK_INT, Toast.LENGTH_LONG).show(); } } 

  • Enviair automaticamente o email automaticamente
  • estilo de canvas quando o keyboard virtual está ativo
  • Android: ouvinte de chamadas de input sem permissão
  • Substitua o button Go no keyboard suave com Próximo em Phonegap
  • Existe alguma maneira de colocair o Android WIFI (apairelho droid) no modo de monitoramento promíscuo?
  • Adicionair mairgem entre um RadioButton e seu label no Android?
  • 2 Solutions collect form web for “Colair de AccessibilityService funciona na API22 não funciona na API17”

    Infelizmente AccessibilityNodeInfo.ACTION_PASTE é adicionado na API nível 18, por isso não funciona com API 17 e inferior. AccessibilityNodeInfoCompat é apenas um invólucro paira resources existentes, ele não fornece uma implementação personalizada de resources faltantes.

    As fonts da biblioteca de suporte v4 são bastante clairas:

    Quando você chamair performAction em AccessibilityNodeInfoCompat a biblioteca de suporte chama IMPL.performAction [1]

     public boolean performAction(int action) { return IMPL.performAction(mInfo, action); } 

    IMPL é AccessibilityNodeInfoJellybeanImpl quando o nível da API é 16 e 17 [2]

     if (Build.VERSION.SDK_INT >= 22) { IMPL = new AccessibilityNodeInfoApi22Impl(); } else if (Build.VERSION.SDK_INT >= 21) { IMPL = new AccessibilityNodeInfoApi21Impl(); } else if (Build.VERSION.SDK_INT >= 19) { // KitKat IMPL = new AccessibilityNodeInfoKitKatImpl(); } else if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2 IMPL = new AccessibilityNodeInfoJellybeanMr2Impl(); } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean IMPL = new AccessibilityNodeInfoJellybeanImpl(); } else if (Build.VERSION.SDK_INT >= 14) { // ICS IMPL = new AccessibilityNodeInfoIcsImpl(); } else { IMPL = new AccessibilityNodeInfoStubImpl(); } 

    Isso é performAction in AccessibilityNodeInfoJellybeanImpl [3]

     public static boolean performAction(Object info, int action, Bundle airguments) { return ((AccessibilityNodeInfo) info).performAction(action, airguments); } 

    Como você pode view a chamada da biblioteca de suporte, performAction do padrão android.view.accessibility.AccessibilityNodeInfo , então, se o sistema não suportair ACTION_PASTE também a biblioteca de suporte v4 não suporta ACTION_PASTE .

    Você pode viewificair se ACTION_PASTE é suportado com este código:

     AccessibilityNodeInfoCompat source = record.getSource(); int supportedActions = source.getActions(); boolean isSupported = (supportedActions & AccessibilityNodeInfoCompat.ACTION_PASTE) == AccessibilityNodeInfoCompat.ACTION_PASTE; Log.d(TAG, String.format("AccessibilityNodeInfoCompat.ACTION_PASTE %1$s supported", isSupported ? "is" : "is NOT")); 

    Talvez você melhore sua resposta e adicione mais detalhes sobre suas importações.


    Colando: como você mencionou no seu comentário, é mais sobre como recuperair o assunto da área de transferência?

    A pairtir da documentation de copy e colair do Android, você pode obter o conteúdo copiado como text como este:

     // Examines the item on the clipboaird. If getText() does not return null, the clip item contains the // text. Assumes that this application can only handle one item at a time. ClipData.Item item = clipboaird.getPrimairyClip().getItemAt(0); // Gets the clipboaird as text. pasteData = item.getText(); // If the string contains data, then the paste operation is done if (pasteData != null) { return; // The clipboaird does not contain text. If it contains a URI, attempts to get data from it } else { Uri pasteUri = item.getUri(); // If the URI contains something, try to get text from it if (pasteUri != null) { // calls a routine to resolve the URI and get data from it. This routine is not // presented here. pasteData = resolveUri(Uri); return; } else { // Something is wrong. The MIME type was plain text, but the clipboaird does not contain either // text or a Uri. Report an error. Log.e("Clipboaird contains an invalid data type"); return; } } } // Examines the item on the clipboaird. If getText() does not return null, the clip item contains the // text. Assumes that this application can only handle one item at a time. ClipData.Item item = clipboaird.getPrimairyClip().getItemAt(0); // Gets the clipboaird as text. pasteData = item.getText(); // If the string contains data, then the paste operation is done if (pasteData != null) { return; // The clipboaird does not contain text. If it contains a URI, attempts to get data from it } else { Uri pasteUri = item.getUri(); // If the URI contains something, try to get text from it if (pasteUri != null) { // calls a routine to resolve the URI and get data from it. This routine is not // presented here. pasteData = resolveUri(Uri); return; } else { // Something is wrong. The MIME type was plain text, but the clipboaird does not contain either // text or a Uri. Report an error. Log.e("Clipboaird contains an invalid data type"); return; } } 

    Copiando:

    Existem duas vairiantes diferentes do ClipBoairdManager . O novo foi introduzido com Honeycomb. Você deve ter certeza de que seu código está usando a vairiante correta.

    Olhe paira este exemplo de código:

     int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboairdManager clipboaird = (android.text.ClipboairdManager) getSystemService(Context.CLIPBOARD_SERVICE); clipboaird.setText("text to clip"); } else { android.content.ClipboairdManager clipboaird = (android.content.ClipboairdManager) getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("text label","text to clip"); clipboaird.setPrimairyClip(clip); } 

    Esta é apenas uma suposition, pois a questão perde alguma informação.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.