使用UiAutomator executeShellCommand以编程方式查询联系人表

时间:2019-05-15 17:39:51

标签: android shell adb contacts uiautomator

我正在尝试使用以下方法来自动执行一些涉及联系人表的操作 UiAutomator。但是我遇到了与脱壳字符有关的怪异问题。

我知道我可以从命令行执行此操作:

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()
    }
}

打印No result found.

但是,删除--where \"account_name=\'SOME_ACCOUNT_NAME\'\"部分,可正确打印

Row: 0 _id=1

我尝试了多种转义"'的方法,但是我迷失在Java String转义字符和shell转义字符之间。

0 个答案:

没有答案