29

There is a command to start an activity based on intent: am start. Also to send a broadcast: am broadcast.

I think probably there should be a shell command to query a content provider, probably something like:

query content://com.myapp.authority/path --where 'column=?' --arg 1 --order 'column desc'

or similar.

Is there one?

Randy Sugianto 'Yuku'
  • 71,383
  • 57
  • 178
  • 228
  • How can I make my application safe from such malicious injection of data?, i.e. how to be immune to "adb shell content insert --uri" – David Prun Mar 23 '15 at 23:43

3 Answers3

59

There is a content command:

usage: adb shell content [subcommand] [options]

usage: adb shell content insert --uri <URI> [--user <USER_ID>] --bind <BINDING> [--bind <BINDING>...]
  <URI> a content provider URI.
  <BINDING> binds a typed value to a column and is formatted:
  <COLUMN_NAME>:<TYPE>:<COLUMN_VALUE> where:
  <TYPE> specifies data type such as:
  b - boolean, s - string, i - integer, l - long, f - float, d - double
  Note: Omit the value for passing an empty string, e.g column:s:
  Example:
  # Add "new_setting" secure setting with value "new_value".
  adb shell content insert --uri content://settings/secure --bind name:s:new_setting --bind value:s:new_value

usage: adb shell content update --uri <URI> [--user <USER_ID>] [--where <WHERE>]
  <WHERE> is a SQL style where clause in quotes (You have to escape single quotes - see example below).
  Example:
  # Change "new_setting" secure setting to "newer_value".
  adb shell content update --uri content://settings/secure --bind value:s:newer_value --where "name='new_setting'"

usage: adb shell content delete --uri <URI> [--user <USER_ID>] --bind <BINDING> [--bind <BINDING>...] [--where <WHERE>]
  Example:
  # Remove "new_setting" secure setting.
  adb shell content delete --uri content://settings/secure --where "name='new_setting'"

usage: adb shell content query --uri <URI> [--user <USER_ID>] [--projection <PROJECTION>] [--where <WHERE>] [--sort <SORT_ORDER>]
  <PROJECTION> is a list of colon separated column names and is formatted:
  <COLUMN_NAME>[:<COLUMN_NAME>...]
  <SORT_ORDER> is the order in which rows in the result should be sorted.
  Example:
  # Select "name" and "value" columns from secure settings where "name" is equal to "new_setting" and sort the result by name in ascending order.
  adb shell content query --uri content://settings/secure --projection name:value --where "name='new_setting'" --sort "name ASC"

usage: adb shell content call --uri <URI> --method <METHOD> [--arg <ARG>]
       [--extra <BINDING> ...]
  <METHOD> is the name of a provider-defined method
  <ARG> is an optional string argument
  <BINDING> is like --bind above, typed data of the form <KEY>:{b,s,i,l,f,d}:<VAL>
Alex P.
  • 30,437
  • 17
  • 118
  • 169
  • How can I make my application safe from such malicious injection of data?, i.e. how to be immune to "adb shell content insert --uri"? – David Prun Mar 23 '15 at 23:42
  • 1
    To guard the ContentProvider, add permission usage to your AndroidManifest.xml, so something like this: `` `` `` – dkneller Apr 02 '15 at 22:08
  • I'm trying to get screen orientation with using this query but it is not working. My command `adb shell content query --uri content://settings/system -projection name:value --where "name='user_rotation'"` – kanna Jul 15 '16 at 21:07
  • @kanna In your case, change `"name='user_rotation'"` to `"name=\'user_rotation\'"` –  Apr 19 '20 at 12:20
0
adb shell content query --uri content://com.myapp.authority/path --where column=x --arg 1 --sort column_name DESC
karel
  • 5,489
  • 46
  • 45
  • 50
0

It appears that some shells (ZSH?) on MacOS require some weird escaping to make this work:

adb shell content query --uri content://settings/global --where "name\ =\ \'airplane_mode_radios\'"

instead of

adb shell content query --uri content://settings/global --where "name = 'airplane_mode_radios'"
GreenGiant
  • 4,930
  • 1
  • 46
  • 76