adb-shell-传json给android-service

原文连接

http://www.duozhi.online/2023/11/09/adb-shell-%e4%bc%a0json%e7%bb%99android-service/

背景

mac m1笔记本

service是intentService

java书写的

问题(adb传参为json,但是接收到的数据不是json):

我的传参数命令为:

 adb shell am start-foreground-service -n "com.example.myservice/com.example.myservice.MyIntentService" -e 'myvar' '{"resource":"rear","position":0}'

但是,android中接到的参数为

只接收到一点数据,这是怎么回事??

解决方式(注意单引号呀)

正确姿势为:

adb shell am start-foreground-service -n "com.example.myservice/com.example.myservice.MyIntentService" -e 'myvar' '\{\"resource\":\"rear\"\,\"position\":\"1\"\}'

或

 adb shell am start-foreground-service -n "com.example.myservice/com.example.myservice.MyIntentService" -e myvar '"{\"resource\":\"rear\",\"position\":\"1\"}"'

以上两个命令在wondows电脑上不太行

那么接收到的数据才是
{"resource":"rear","position":"1"}

代码书写方式(windows和mac都可以)

func execAdb(param string) string {
fmt.Println("param--", param)
jsondata, err := json.Marshal(param)
if err != nil {
return fmt.Sprintf("marshal err: %s.....\n", err.Error())
}
jsonstring := string(jsondata)
fmt.Println("jsonstring--", jsonstring)
shellCmd := fmt.Sprintf("adb shell am start-foreground-service -n \"com.example.myservice/com.example.myservice.MyIntentService\" -e myvar '%s'", jsonstring)
fmt.Println("shell cmd----", shellCmd)
cmd := exec.Command("sh", "-c", shellCmd)

stderr, err := cmd.StderrPipe()
if err != nil {
return fmt.Sprintf("StderrPipe err: %s.....\n", err.Error())
}
stdout, err := cmd.StdoutPipe()
if err != nil {
return fmt.Sprintf("StdoutPipe err: %s.....\n", err.Error())
}

if err := cmd.Start(); err != nil {
return fmt.Sprintf("Error starting command: %s......\n", err.Error())
}
outData, err := ioutil.ReadAll(stdout)

if err != nil {
return fmt.Sprintf("ReadAll stdout  err: %s.....\n", err.Error())
} else {
if strings.Contains(string(outData), "Error") {
return fmt.Sprintf("stdout  contains err: %s.....\n", string(outData))
}
fmt.Printf("stdout--------%s\n", string(outData))
}
errData, err := ioutil.ReadAll(stderr)

if err != nil {
return fmt.Sprintf("ReadAll stderr  err: %s.....\n", err.Error())
} else {
if len(string(errData)) > 0 {
return string(errData)
}
}

if err := cmd.Wait(); err != nil {
return fmt.Sprintf("Error waiting for command execution: %s.....\n", err.Error())
}
log.Printf("success  command execution: \n")
return "success"
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值