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...
Related
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
Did anyone tried Android multiple display feature which is new in Android O
Following steps which is not working for me
1.connect hdmi cable to mobile(not sure can use USB as well)
2.make device in root and give following command (expect app is installed)
and not seen that app is launching on secondary(Multiple display feature
) it's just reflecting mobile display as it is because connected hdmi cable
adb shell am start com.Chrome.Canary --display 1
Please suggest any other way or any command to make it work?
Android in general do mirroring when two displays are connected. Right now google has not enabled support for touch and display mapping on the two displays. But if you want to launch any activity on any of the two displays then the command adb shell am start "your_activity" --display display_id will launch your activity on that particular display id. If the above command doesn't launch your activity then you can use adb shell am stack start display_id "your activity". This will also work. But regarding touch, it will be mapped to the primary display (display id 0). As per google you can enable the mapping of touch in EventHub.cpp of Android source code but till now I haven't found it useful. Hope my answer helps you.
Ran using below procedure passed with dell monitor:
ADB shell can be used to call Activity Manager(am) for starting any system actions (or an activity).
The syntax:
adb shell am start [-n (component)] [-a (action)] [-t (mime type)] [-d (data_URL)]
examples:
1. For starting ‘Settings app’:
adb shell am start -n com.android.settings/.Settings
In the above-mentioned command, we set component(-n) to be settings in a specific format.
For starting ‘Gallery app’:
adb shell am start -t image/* -a android.intent.action.VIEW
In the above-mentioned command, we are setting action(-a) for opening the default app for gallery with mime type(-t) to be image/*
In general, for external display the ‘display_id’ starts from ‘1’ in an increasing order, final command to do multi display operation is
adb shell am start -n com.android.settings/.Settings --display 1
The above command will display ‘Settings’ app only in external display with display_id = 1. The primary display will be in the same mode as before executing the command.
I'm running a script on android and in effort to make it as portable as possible, all commands use busybox. How I've got it set up currently, is every command has a function named the same, so it converts those commands to use busybox, like so:
echo () {
busybox echo $1 $2 $3 $4 $5
}
echo "hai"
As this has to be done for every command, it takes a lot of space inside the script. That's why I'm trying to figure out a way to force the shell to default to using busybox rather than /system/bin or /system/xbin.
Could this be achieved by modifying the PATH variable? Or is there an environment variable build into shell I could use?
Or should I do something like this?:
bs () {
busybox $#
}
bs echo "Some text"
(I'd like to avoid this if possible as it decreases readability)
EDIT
Could I start a background process that loops and when it detects a command being passed for the shell to processes, it stops this and passes it to busybox? Somehow read from stdin before shell processes it?
EDIT 2
So I thought about redirecting commands into busybox like this:
busybox <<EOF
echo "hai";
EOF
Could this be used somehow?
UPDATE
I've moved to using busyboxes ash shell and it does everything I want it to do. Appareantly there's no way of intercepting commands before they're passed to the shell.
Use the shell's built-in 'alias' (Alias Substitution, Shell Command Language, IEEE Standard 1003.1 (2013) ) method.
For example:
alias vi="busybox vi"
vi readme.txt
will substitute the word 'vi' with 'busybox vi' and the shell will then process
busybox vi readme.txt
Because it is a simple substitution, all parameters are preserved and passed on to the substituted command.
You can also add default parameters to the substitution like so:
alias fbset="busybox fbset -fb /dev/graphics/fb0"
after which one no longer needs to specify the frame buffer - it is added for you. And typically programs will take the last specified parameter as the active one, so if you do need to specify another frame buffer (in the above example) it will ignore the one provided in the alias.
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
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.