Android – Импорт контактов через vCards через ADB

В настоящее время я пытаюсь автоматизировать некоторые действия Android через ADB и застревать с импортом контактов через vCards. Есть два способа сделать это:

  1. Автоматизировать точные «привязки» пользователя, что предполагает, что вам нужно определить положение каждой «кнопки» в соответствии с разрешением экрана и т. Д. Это то, что я сделал прямо сейчас, но это действительно сложно поддерживать, поскольку есть Слишком много параметров, которые необходимо учитывать (пользовательские ромы, сверхвысокие разрешения, портрет / пейзаж и т. Д.).

  2. Найти то, что происходит, когда вы нажимаете «импортный контакт из vCards» и выполняете это действие через ADB

В принципе, я хотел бы применить второй вариант, но я не знаю, что происходит, когда вы нажимаете «импортировать контакты из vCard», и мне нужно будет вызвать то же действие / намерение от АБР. Любая идея в команде ADB, которую я должен выполнить?

Попробуй это. Обновить параметр -d с правильным vcf .

 adb shell am start -t "text/x-vcard" -d "file:///sdcard/contacts.vcf" -a android.intent.action.VIEW com.android.contacts 
  • Mime Тип: text/vcard или text/x-vcard
  • URI: путь к vcard
  • Действие: android.intent.action.VIEW
  • Пакет: com.android.contacts

Выбранный ответ не помог мне. Мне нужна была эта функциональность для нескольких конкретных тестов. Итак, что я сделал, добавлен Override BeforeSuite для проверки класса, внутри которого я вызывал методы из нижеперечисленных классов и назывался методом суперкласса после.

 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; } 

}

а также

 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; } 

}

Intereting Posts
GridLayout выталкивает своих детей и переполняет, когда задано fill_parent для высоты Индексирование приложений Android – «<link>» в «<head>» не работает Intent URI для запуска приложения Gmail Как программно сделать небольшую кнопку обернуть небольшой текст Android: установка тонального сигнала SMS-уведомления HTML-ссылку, чтобы открыть собственную карту Android или IOS с ярлыком бездорожья Android dumpsys batteryinfo vs android dumpsys batterystats Android: «nowrap» в Spannable в TextView Горизонтальная прокрутка в горизонтальных листах прокрутки «UnsatisfiedLinkError» появляется, когда «dynamic_cast» используется в Android NDK Android VideoView: просмотр видео в диалоговом окне намного темнее Отправка DatagramPacket без подключения к Интернету – Android Android ускоряет использование процессора (и медленно!) Позвоните, чтобы проверить, существует ли текущий EGLContext в Android Не удается получить доступ к серверу Apache с телефона Android