Запросы к таблице контактов программно с помощью UiAutomator executeShellCommand - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь автоматизировать некоторые действия с таблицей контактов, используя UiAutomator .Но у меня возникла странная проблема, связанная с escape-символами оболочки.

Я знаю, что могу сделать это из командной строки:

adb shell content query --uri content://com.android.contacts/raw_contacts --projection _id --where "account_name=\’SOME_ACCOUNT_NAME\’"

, что будет правильновывод (есть один контакт с account_name=SOME_ACCOUNT_NAME)

Row: 0 _id=1

, но когда я пытаюсь сделать это с помощью кода, подобного следующему:

@Test
fun test_01_a_user_can_setup_P2P_mode() {
    val uiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
    uiAutomation.executeShellCommand("content query --uri content://com.android.contacts/raw_contacts --projection _id --where \"account_name=\'SOME_ACCOUNT_NAME\'\"")

    val baos = ByteArrayOutputStream()
    writeDataToByteStream(fd!!, baos)

    val output = String(baos.toByteArray())
    Log.println(Log.DEBUG, "TAG", output)
}

private val BUFFER_SIZE = 8192

private fun writeDataToByteStream(
        pfDescriptor: ParcelFileDescriptor, outputStream: ByteArrayOutputStream) {
    val inputStream = ParcelFileDescriptor.AutoCloseInputStream(pfDescriptor)
    try {
        val buffer = ByteArray(BUFFER_SIZE)
        var len = inputStream.read(buffer)
        while (len >= 0) {
            outputStream.write(buffer, 0, len)
            len = inputStream.read(buffer)
        }
    } finally {
        inputStream.close()
    }
}

printts No result found.

Однако, удалив часть --where \"account_name=\'SOME_ACCOUNT_NAME\'\", исправил отпечатки

Row: 0 _id=1

Я пробовал много разных способов избежать " и ', но я 'потеряно между escape-символами Java String и escape-символами оболочки.

...