I\'m trying to send JSON data as extra on an Android broadcast which I send via ADB to the device. But it looks like the data which gets to the device is not as expected.
Your workaround was a huge help!
It indicates that the problem is in quoting through two shells (host plus Android). Shell quoting is a horrible tarpit but there's serious extra weirdness here.
After experimenting with "echo" commands, I found that adb shell's argument must be quoted as a single argument to the local shell and the JSON payload must be quoted as a single argument to the Android shell.
Here's a general solution (and it doesn't require sprinkling \
-quoting of "
, !
, {
, and }
chars in the JSON text):
adb shell "am broadcast -a com.test.android.ACTION_TEST_FEATURE -n com.test.android/.receivers.TestsReceiver -e notify '"'{"debug": false, "title": "Application update!"}'"'"
Pattern: adb shell "am broadcast ... '"'JSON_TEXT'"'"
The inner pair of '
marks quotes the JSON_TEXT locally while the outer pair quotes it remotely. That outer pair is in turn "
-quoted.
ok, I just found a solution. I first have to enter the devices shell via adb shell
and then execute am broadcast -a com.test.android.ACTION_TEST_FEATURE -n com.test.android/.receivers.TestsReceiver --es "notify" '{"debug": false, "title": "Application update!"}'
This should be the structure of the adb command.
adb shell "am broadcast -a YOUR_BROADCAST_INTENT_ACTION -n YOUR_APP_PACKAGE/.PATH_TO_BROADCAST_RECIEVER_CLASS.BROADCAST_RECEIVER_CLASS -e 'STRING_KEY' 'DATA HERE'"
The above command will ensure delivery of the intent to the receiver even if the string has spaces in it.
adb shell "am broadcast -a wingoku.custom.invoking.event -n com.wingoku.root/.broadcastReceivers.MyReceiver-e 'shellCommand' 'hello world. My name is umer'"
i know this is an old post, but i have some thoughts.
after struggle to pass data through cmd and bash args, or subprocess in program, i found use base64 to encode json dumped data is extremely convenient, just base64 decode and then json loads, no worry about quote, space, tab, anything.