adb shell input text Android 11 inCall - android

I have a problem when sending DTMF events inside of an active call.
I am using adb shell input text #0123* to send DTMF tones. This was working good so far for older Android versions. Starting from Android 11 (I didn't check 12 yet), special characters * and # are not working anymore and sending 8 and 3 instead.
If I am sending the text at other text fields, the special chars are formatted correctly, the error is only occurring inside the call application when having an active call and trying to send DTMF tones via dialpad.
Edit:
I tried sending with ' escaped:
User:~$ adb -s RF8N31NZ5SK shell
x1s:/ $ input text '#*'
x1s:/ $
But result is the same:
Edit-2:
It looks like dialer is not allowing special chars anymore on Android >= 11. I managed to do it via keyevents KEYCODE_POUND and KEYCODE_STAR:
User:~$ adb -s RF8N31NZ5SK shell
x1s:/ $ input keyevent KEYCODE_POUND
x1s:/ $ input keyevent KEYCODE_STAR
x1s:/ $

You can try adding apostrophe to surround text to sent because # character is used for comments on Android shell :
adb shell input text '#1234*'
It worked on my side with Android 11

You can escape the hash character and place the whole input text in double quotes:
adb shell input text "\#1234*"
Note: In my tests I had to use double quotes, single quotes were not working, with single quotes the typed text was \#1234*. But this may depend on the used terminal/platform for executing the whole command (in my case Windows 10 command-line/cmd.exe).
This commands works for me and

Related

How to obtain IMEI via adb?

I'm trying to track devices, SIMs and airtime cards for test purposes. I have multiple devices plugged into a computer and since the recent update to Android 12, I am not able to get the device IMEI. The IMEI is basically the device's FCC-required serial number and can be obtained from the UI with relative ease, but how can I obtain it via ADB or in some automated method on multiple devices from multiple carriers and OEMs?
Prior to Android 12 FEB patch, I would use service call iphonesubinfo 1 or service call iphonesubinfo 4. But unfortunately after the update I receive back Result: Parcel(ffffffffc ffffffff 00000000 '................') whereas before I would receive a parcel containing the IMEI for processing via script.
Is there a way to get IMEI on Android 12+? I am trying to stay away from using an app. This is a simple thing, from a privileged user (adb shell). It seems like a basic necessity for tracking and logistics purposes.
This command works to obtain IMEI. It works by pressing the dialer key, then typing *#06#, then parsing the text on screen to find the IMEI Label and the next element which contains the actual IMEI. Finally it parses that element by removing all before text=" and all after ".
adb shell "imei=$(input keyevent KEYCODE_CALL;sleep 1;input text '*#06#'; uiautomator dump --compressed /dev/stdout|sed s/\>\<\/\\n/g|grep -A1 IMEI|tail -n1|sed -e 's/.*text=\"//' -e 's/\".*//'); echo ${imei}"
to get just the 16-digit IMEI without checksum, replace the final echo statement with echo ${imei:0:16}
I found a good solution for Samsung One UI
First, run the About menu
adb shell am start -a com.android.settings.ACTION_DEVICE_INFO_SETTINGS
Then dump the UI
adb shell uiautomator dump
View the dump file
adb shell cat /sdcard/window_dump.xml
The IMEI1 in the <node index="12" and IMEI 2 in <node index="13"

How can I open the dial pad during a call using adb?

When I need to see my doctor I have to:
Call to 666666666
Wait 5 seconds
Press 1
Wait 5 seconds
Press 20301990
Wait 5 secondos
Press 1
So I want to automatizate all this steps
I know that I can fire the call doing:
adb shell am start -a android.intent.action.CALL -d tel:666666666
and I can simulate a input by:
sleep 5
adb shell input text "1"
sleep 5
adb shell input text "20*30*1990"
sleep 5
adb shell input text "1"
but It can't work if I don't open de dial pad after adb shell am start -a android.intent.action.CALL -d tel:666666666 and before adb shell input text "1"
So my question is: How can I open the dial pad during a call using adb?
You can find the coordinates of the dial's pad button and then simulate a press by sending input tap x y.
If your automation will be used on multiple devices from different types, I would advise you to write a simple python script that uses uiautomator to do that task.

send keyboard input to firestick via adb

I've been trying to write a batch so I can type on my PC via adb and send input to firestick tv.
I have accomplished this with the following script:
:Start
adb connect 1XX.1XX.1.X1X
set /p intxt=Type...
adb shell input keyboard text "%intxt%"
pause
GOTO Start
But if you send text input to device via adb you need to add %S to enter spaces between words. For example for "Hello World" you need to input Hello%sWorld
Please HELP! I have been trying for week with no results.
This is the closest I have gotten to a solution, but it doesn't seam to work:
set filename=%filename: ="%s"%
#ECHO OFF
SETLOCAL enabledelayedexpansion
SET "intxt=something containing spaces"
set "intxt=!intxt: =%%s!"
SET intxt
ECHO adb shell input keyboard text "%intxt%"
FOR /f %%x IN ("%intxt%") DO ECHO %%x
GOTO :EOF
Seems to work with echo - whether adb sees it the same way is for you to experiment with and report back...

Can I send keystrokes to my USB-connected Android phone?

Is there any generic app for Windows and/or Andorid that enables me to send keystrokes to my USB-connected developer-enbled Android phone? Ideally it would be a toggle button that switches whether to send my keystrokes to Windows or to Android.
My use case is that I have apps that require a bit of text punching and I'd like to do that with my physical keyboard instead of my touch based phone. I do not want to physically connect my keyboard directly to my phone. It is now connected to the PC.
You can use the ADB for that.
You can do it drom the command line - adb shell input text "my text" or from "inside" the decice - open first the shell - adb shell and from the device's command line type input "my text"
adb shell input text "my text" -- will FAIL
Error: Invalid arguments for command: text
usage: input ...
input text
input keyevent
input tap
input swipe
you need to escape the following characters:
( ) < > | ; & * \ ~ " ' 'escaping' means putting a backslash ( \ ) before the offending character.
space is escaped by using %s
adb shell input text "my%stext" -- will work

How to use ADB to send touch events to device using sendevent command?

I am trying to send touch events to a device using AndroidDebugBridge, so that I can do some basic automation for UI tests. I have followed the discussion in LINK. I am able to use sendevent to simulate touch on emulators, but unable to do the same on a device.
Like in above link the emulator seems to send out 6 events for each touch ( xcoord, ycoord, 2 for press,2 for release) and it was easy to use this information to sendevents, but a getevent for the touchscreen for a device seems to generate far too many events.
Has somebody managed to send touch from ADB to a device? Could you please share the solution.
Android comes with an input command-line tool that can simulate miscellaneous input events. To simulate tapping, it's:
input tap x y
You can use the adb shell ( > 2.3.5) to run the command remotely:
adb shell input tap x y
In order to do a particular action (for example to open the web browser), you need to first figure out where to tap. To do that, you can first run:
adb shell getevent -l
Once you press on the device, at the location that you want, you will see this output:
<...>
/dev/input/event3: EV_KEY BTN_TOUCH DOWN
/dev/input/event3: EV_ABS ABS_MT_POSITION_X 000002f5
/dev/input/event3: EV_ABS ABS_MT_POSITION_Y 0000069e
adb is telling you that a key was pressed (button down) at position 2f5, 69e in hex which is 757 and 1694 in decimal.
If you now want to generate the same event, you can use the input tap command at the same position:
adb shell input tap 757 1694
More info can be found at:
https://source.android.com/devices/input/touch-devices.html
http://source.android.com/devices/input/getevent.html
2.3.5 did not have input tap, just input keyevent and input text
You can use the monkeyrunner for it: (this is a copy of the answer at https://stackoverflow.com/a/18959385/1587329):
You might want to use monkeyrunner like this:
$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)
You can also do a drag, start activies etc.
Have a look at the api for MonkeyDevice.
You don't need to use
adb shell getevent -l
command, you just need to enable in Developer Options on the device [Show Touch data] to get X and Y.
Some more information can be found in my article here: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/
Building on top of Tomas's answer, this is the best approach of finding the location tap position as an integer I found:
adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'
Use adb shell getevent -l to get a list of events, the using grep for ABS_MT_POSITION (gets the line with touch events in hex) and finally use awk to get the relevant hex values, strip them of zeros and convert hex to integer. This continuously prints the x and y coordinates in the terminal only when you press on the device.
You can then use this adb shell command to send the command:
adb shell input tap x y
Consider using Android's uiautomator, with adb shell uiautomator [...] or directly using the .jar that comes with the SDK.

Categories

Resources