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

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

  1. автоматизировать точные "удары" из пользователей, который предполагает, что у вас есть, чтобы определить положение каждой кнопки "" в соответствии с разрешением экрана и т. д. Это то, что я сделал прямо сейчас, но это действительно трудно поддерживать, так как есть слишком много параметров, которые нужно учитывать (пользовательские ПЗУ, резолюции странно, портрет/пейзаж мод и т. д.).

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

в принципе, я хотел бы применить 2-й вариант, но я не знаю, что происходит, когда вы нажимаете "импорт контактов из vCard", который мне нужно было бы назвать тем же действием/намерением от ADB. Есть идеи по команде ADB, которую я должен выполнить ?

2 ответов


попробуйте это. Update правильно 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 для тестирования класса, внутри которого я вызвал методы из приведенных ниже классов и вызвал метод super class.

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

}