VNC server app for Android that does not require root privileges.
GPL-2.0 License
This is an Android VNC server using contemporary Android 5+ APIs. It therefore does not require root access. In reverence to the venerable droid-VNC-server is is called droidVNC-NG.
If you have a general question, it's best to ask in the community chat. If your concern is about a bug or feature request instead, please use the issue tracker.
Start on Boot
off.Start
and connect to your device.You should allow Port Forwarding in your router's Firewall settings. Login to your router's settings (usually open 192.168.1.1 in your browser, some routers have password written on them).
Find Port Forwarding, usually it's somewhere in Network - Firewall - Port Forwards.
Create a new rule, this is an example from OpenWRT firmware.
Name: VNC forwarding
Protocol: TCP
Source zone: wan may be "internet", "modem", something that suggests the external source.
External port: 5900 by default or whatever you specified in the app.
Destination zone: lan something that suggests local network.
Internal IP address: your device's local IP address, leaving any is less secure. The device's address may change over time! You can look it up in your routers' connected clients info.
Internal port: same as external port.
Apply the settings, sometimes it requires rebooting a router.
Figure out your public adress i.e. https://www.hashemian.com/whoami/.
Use this address and port from above to connect to your device.
DroidVNC-NG can read a JSON file with default settings that apply if settings were not changed
by the user. A file named defaults.json
needs to created under
<external files directory>/Android/data/net.christianbeier.droidvnc_ng/files/
where
depending on your device, <external files directory>
is something like /storage/emulated/0
if
the device shows two external storages or simply /sdcard
if the device has one external storage.
An example defaults.json
with completely new defaults (not all entries need to be provided) is:
{
"port": 5901,
"portReverse": 5555,
"portRepeater": 5556,
"scaling": 0.7,
"viewOnly": false,
"showPointers": true,
"fileTransfer": true,
"password": "supersecure",
"accessKey": "evenmoresecure",
"startOnBoot": true,
"startOnBootDelay": 0
}
droidVNC-NG features a remote control interface by means of Intents. This allows starting the VNC server from other apps or on certain events. It is designed to be working with automation apps like MacroDroid, Automate or Tasker as well as to be called from code.
You basically send an explicit Intent to net.christianbeier.droidvnc_ng.MainService
with one of
the following Actions and associated Extras set:
net.christianbeier.droidvnc_ng.ACTION_START
: Starts the server.
net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY
: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID
: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.net.christianbeier.droidvnc_ng.EXTRA_PORT
: Optional Integer Extra setting the listening port. Set to -1
to disable listening.net.christianbeier.droidvnc_ng.EXTRA_PASSWORD
: Optional String Extra containing VNC password.net.christianbeier.droidvnc_ng.EXTRA_SCALING
: Optional Float Extra between 0.0 and 1.0 describing the server-side framebuffer scaling.net.christianbeier.droidvnc_ng.EXTRA_VIEW_ONLY
: Optional Boolean Extra toggling view-only mode.net.christianbeier.droidvnc_ng.EXTRA_SHOW_POINTERS
: Optional Boolean Extra toggling per-client mouse pointers.net.christianbeier.droidvnc_ng.EXTRA_FILE_TRANSFER
: Optional Boolean Extra toggling the file transfer feature.net.christianbeier.droidvnc_ng.EXTRA_FALLBACK_SCREEN_CAPTURE
: Optional Boolean Extra indicating whether to start with fallback screen capture that does not need anet.christianbeier.droidvnc_ng.ACTION_CONNECT_REVERSE
: Make an outbound connection to a listening viewer.
net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY
: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID
: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.net.christianbeier.droidvnc_ng.EXTRA_HOST
: Required String Extra setting the host to connect to.net.christianbeier.droidvnc_ng.EXTRA_PORT
: Optional Integer Extra setting the remote port.net.christianbeier.droidvnc_ng.EXTRA_RECONNECT_TRIES
: Optional Integer Extra setting the number of tries reconnecting a once established connection. Needs request id to be set.net.christianbeier.droidvnc_ng.ACTION_CONNECT_REPEATER
Make an outbound connection to a repeater.
net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY
: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID
: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.net.christianbeier.droidvnc_ng.EXTRA_HOST
: Required String Extra setting the host to connect to.net.christianbeier.droidvnc_ng.EXTRA_PORT
: Optional Integer Extra setting the remote port.net.christianbeier.droidvnc_ng.EXTRA_REPEATER_ID
: Required String Extra setting the ID on the repeater.net.christianbeier.droidvnc_ng.EXTRA_RECONNECT_TRIES
: Optional Integer Extra setting the number of tries reconnecting a once established connection. Needs request id to be set.net.christianbeier.droidvnc_ng.ACTION_STOP
: Stops the server.
net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY
: Required String Extra containing the remote control interface's access key. You can get/set this from the Admin Panel.net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID
: Optional String Extra containing a unique id for this request. Used to identify the answer from the service.The service answers with a Broadcast Intent with its Action mirroring your request:
net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID
: The request id this answer is for.net.christianbeier.droidvnc_ng.EXTRA_REQUEST_SUCCESS
: Boolean Extra describing the outcome of the request.There is one special case where the service sends a Broadcast Intent with action
net.christianbeier.droidvnc_ng.ACTION_STOP
without any extras: that is when it is stopped by the
system.
Using adb shell am
syntax:
adb shell am start-foreground-service \
-n net.christianbeier.droidvnc_ng/.MainService \
-a net.christianbeier.droidvnc_ng.ACTION_START \
--es net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY de32550a6efb43f8a5d145e6c07b2cde \
--es net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID abc123 \
--ei net.christianbeier.droidvnc_ng.EXTRA_PORT 5901 \
--es net.christianbeier.droidvnc_ng.EXTRA_PASSWORD supersecure \
--ez net.christianbeier.droidvnc_ng.EXTRA_VIEW_ONLY true
net.christianbeier.droidvnc_ng.ACTION_START
net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY:<your api key from DroidVNC-NG start screen>
net.christianbeier.droidvnc_ng
net.christianbeier.droidvnc_ng.MainService
<manifest>
namepace:<queries>
<package android:name="net.christianbeier.droidvnc_ng" />
</queries>
val intent = Intent()
intent.setComponent(ComponentName("net.christianbeier.droidvnc_ng", "net.christianbeier.droidvnc_ng.MainService"))
intent.setAction("net.christianbeier.droidvnc_ng.ACTION_START")
intent.putExtra("net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY", "<your api key from DroidVNC-NG start screen>")
startForegroundService(intent)
For example from Java code:
See MainActivity.java.
Using adb shell am
syntax again:
adb shell am start-foreground-service \
-n net.christianbeier.droidvnc_ng/.MainService \
-a net.christianbeier.droidvnc_ng.ACTION_STOP \
--es net.christianbeier.droidvnc_ng.EXTRA_ACCESS_KEY de32550a6efb43f8a5d145e6c07b2cde \
--es net.christianbeier.droidvnc_ng.EXTRA_REQUEST_ID def456
git submodule update --init
.gradlew
.Contributions to the project are very welcome and encouraged! They can come in many forms. You can:
Requires at least Android 7.
Since Android 10,
the permission to access the screen contents has to be given on each start and is not saved. You can,
however, work around this by installing adb
(or simply Android Studio) on a PC, connecting the device running droidVNC-NG to that PC and running
adb shell cmd appops set net.christianbeier.droidvnc_ng PROJECT_MEDIA allow
once. Alternatively, if
using the intent interface, you can also start with net.christianbeier.droidvnc_ng.EXTRA_FALLBACK_SCREEN_CAPTURE
set to true.
You can also use adb to manually give input permission prior to app start via adb shell settings put secure enabled_accessibility_services net.christianbeier.droidvnc_ng/.InputService:$(adb shell settings get secure enabled_accessibility_services)
.
If you are getting a black screen in a connected VNC viewer despite having given all permissions, it might be that your device does not support Android's MediaProjection API correctly. To find out, you can try screen recording with another app, ScreenRecorder. If it fails as well, your device most likely does not support screen recording via MediaProjection. This is known to be the case for Android-x86.
In case you happen to have a board with an Ethernet interface and experience strange hangs during a VNC session, setting the interface to a slower speed might help. This workaround can be applied with mii-tool, for instance.
If you see a a floating button similar to this on your screen after enabling accessibility, make sure you have the "shortcut" option in accessibility settings turned to off.
Due to limitations in Android API, secondary displays are not supported.