我正在尝试使用以下方法来自动执行一些涉及联系人表的操作 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转义字符之间。