Android – Importación de contactos a través de vCards a través de ADB

Actualmente estoy tratando de automatizar algunas acciones de Android a través de ADB y quedar atascado con la importación de contacto a través de vCards. Hay 2 maneras de hacer esto:

  1. Automatizar los "tappings" exactos del usuario, lo que supone que tienes que determinar la posición de cada "botón" de acuerdo a la resolución de la pantalla, etc. Es lo que he hecho ahora mismo, pero realmente parece difícil de mantener, ya que hay Demasiados parámetros a tener en cuenta (rom personalizado, resoluciones extrañas, retrato / paisaje mod, etc).

  2. Encontrar lo que está sucediendo cuando haces clic en "importar contacto de vCards" y hacer esta acción a través de ADB

Básicamente, me gustaría aplicar la segunda opción, pero no sé lo que está sucediendo cuando haces clic en "importar contactos de vCard", que tendría que llamar a la misma acción / intención de ADB. ¿Alguna idea sobre el comando ADB que debería ejecutar?

2 Solutions collect form web for “Android – Importación de contactos a través de vCards a través de ADB”

Prueba esto. Actualiza la opción -d con la ruta vcf correcta.

 adb shell am start -t "text/x-vcard" -d "file:///sdcard/contacts.vcf" -a android.intent.action.VIEW com.android.contacts 
  • Tipo de Mime: text/vcard o text/x-vcard
  • URI: ruta de acceso a vcard
  • Acción: android.intent.action.VIEW
  • Paquete: com.android.contacts

La respuesta seleccionada no funcionó para mí. Necesitaba esa funcionalidad para varias pruebas específicas. Así que lo que hice se agregó Override BeforeSuite para probar la clase dentro de la cual llamé métodos de las clases de abajo y llamé método de clase super después.

 public class AdbUtils { private static final String CH_DIR = "cd "; private static final String LOCATE_ADB = "locate -r ~/\".*platform-tools/adb\""; public static void createContacts(List<Contact> contacts) throws Exception { for (int i = 0; i < contacts.size(); i++) { if (i < contacts.size() - 1) { System.out.println(executeCommand(AdbCommands.CREATE_AND_SAVE_CONTACT .getCommand(new String[]{contacts.get(i).getName(), contacts.get(i).getPhoneNumber()}))); } else { System.out.println(executeCommand(AdbCommands.CREATE_AND_SAVE_CONTACT .getCommand(new String[]{contacts.get(i).getName(), contacts.get(i).getPhoneNumber()}))); System.out.println(executeCommand(AdbCommands.START_CONTACTS_APP_LIST_STATE.getCommand(null) + " && " + AdbCommands.SLEEP.getCommand(new String[]{"3"}) + " && " + AdbCommands.PRESS_BACK_BUTTON.getCommand(null))); } } } public static void removeAllContacts() { System.out.println("DEBUG - Delete all contacts: " + executeCommand(new String[]{AdbCommands.DELETE_ALL_CONTACTS_CMD.getCommand(null)})); } private static String executeCommand(String command) { return executeCommand(new String[]{command}); } private static String executeCommand(String[] commandLines) { String adbDir = locatePlatformToolsAdb(); adbDir = adbDir.substring(0, adbDir.length() - 4); String[] command = new String[commandLines.length + 2]; command[0] = "bash"; command[1] = "-c"; commandLines[0] = CH_DIR + adbDir + " && " + commandLines[0]; System.arraycopy(commandLines, 0, command, 2, commandLines.length + 2 - 2); String input; String errorInput = null; try { Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec(command); proc.waitFor(); input = parseInputStream(proc.getInputStream()); errorInput = parseInputStream(proc.getErrorStream()); proc.destroy(); return input; } catch (Exception ex) { ex.printStackTrace(); } return errorInput; } private static String locatePlatformToolsAdb() { String path = null; String error = null; try { Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec(new String[]{"bash", "-c", LOCATE_ADB}); proc.waitFor(); path = parseInputStream(proc.getInputStream()); error = parseInputStream(proc.getErrorStream()); proc.destroy(); } catch (Exception ex) { ex.printStackTrace(); } if(null != path){ System.out.println("DEBUG - Located platform tools: " + path); return path; } else throw new IllegalStateException("DEBUG - error locating adb: " + error); } private static String parseInputStream(InputStream input) { try { BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String line; StringBuilder resultBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { resultBuilder.append(line); } return resultBuilder.toString(); } catch (Exception ex) { ex.printStackTrace(); } return null; } 

}

y

 public enum AdbCommands { WAIT("./adb shell wait"), SLEEP("./adb shell sleep %s"), DELETE_ALL_CONTACTS_CMD("./adb shell pm clear com.android.providers.contacts"), START_CONTACTS_APP_LIST_STATE("./adb shell am start com.android.contacts"), PRESS_RECENT_BUTTON("./adb shell input keyevent 187"), PRESS_HOME_BUTTON("./adb shell input keyevent 3"), PRESS_BACK_BUTTON("./adb shell input keyevent 4"), CREATE_CONTACT("./adb shell am start -a android.intent.action.INSERT -t vnd.android.cursor.dir/contact " + "-e name '%s' -e phone %s"), CREATE_AND_SAVE_CONTACT(CREATE_CONTACT.getCommand(null) + " && ./" + SLEEP.getCommand(new String[]{"3"}) + " && ./" + PRESS_RECENT_BUTTON.getCommand(null) + " && ./" + SLEEP.getCommand(new String[]{"3"}) + " && ./" + PRESS_RECENT_BUTTON.getCommand(null) + " && ./" + SLEEP.getCommand(new String[]{"3"}) + " && ./" + PRESS_BACK_BUTTON.getCommand(null) + " && ./" + SLEEP.getCommand(new String[]{"3"})); private String command; private static final String arg = "%s"; AdbCommands(String command){ this.command = command; } public String getCommand(@Nullable String[] args){ String command = this.command; if(null == args) { return this.command; } else{ if(countSubstring(this.command, arg) != args.length) throw new IllegalArgumentException("wrong args count!"); for (String arg : args) { command = command.replaceFirst(AdbCommands.arg, arg); } return command; } } private int countSubstring(String str, final String subStr){ int lastIndex = 0; int count = 0; while(lastIndex != -1){ lastIndex = str.indexOf(subStr,lastIndex); if(lastIndex != -1){ count ++; lastIndex += subStr.length(); } } return count; } 

}

  • No se puede conectar Nexus 4 a adb: no autorizado
  • ¿Puedo emular la actualización de la aplicación con ADB?
  • Filtrar etiquetas en LogCat (en el complemento Android Eclipse)
  • ¿Es posible usar comandos adb para hacer clic en una vista encontrando su ID?
  • Android: cómo borrar caché de aplicaciones y mantener datos de usuario a través de adb?
  • ADB no puede encontrar Nexus 7 en Mac OS X Mavericks
  • Driver adb para windows 7 Samsung galaxy S3
  • ¿Cómo utilizar adb tcpip sin la depuración USB activada?
  • Android adb velocidad usb
  • Cómo detener una aplicación de Android desde la consola
  • Puedo usar adb shell para enviar comandos a mi aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.