Android-Импорт контактов через vCards через ADB
в настоящее время я пытаюсь автоматизировать некоторые действия Android через ADB и застрять с импортом контактов через vCards. Есть 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;
}
}