So you’ve done a cool graphic app on your Raspberry Pi wouldn’t it be nice to see it on your Android phone ? Well luckily there are a couple of X Server apps that you can run on your Android phone that allows you to see your Pi graphic apps.
X Server Apps for Android
When you do a search for “x servers” on Android Play Store, you will get a few results.
X Server XSDL from pelya, has good reviews and I found it to be fairly robust. My only comment was I wasn’t sure how to clear the background help statements, and it made the screen look a little messy.
X server from Darkside is a beta release. I preferred the background and SSH integration over XSDL, however this app did not always close the window when the code requested it.
Both options are free and open source.
Getting Started with X Windows
There are two main ways for X Windows to be run on a remote system. The first method is that the Window is sent from the Pi (or any Linux/X Windows system) to the Android phone. The second method is what you typically do on a Windows PC using an SSH terminal program like Putty; you SSH (Secure Shell) in to the Rasp Pi and then when you run an app it open on your remote node.
Calling windows from a PC is pretty easy but calling windows from an Android phone is challenging and slow because of the keyboard. The two X Servers apps do not have SSH components built-in but there are some Android SSH client apps that can be run independently or integrated with the Darkside X app.
Sending an X Window from a Raspberry Pi or Linux node is rather straightforward. The sending location of an X window is defined by the DISPLAY session variable. To check its value enter:
~$ echo $DISPLAY localhost:10.0
A typical results will be something like: localhost:10.0 .
To change the DISPLAY variable enter the ipaddress:window_number. In my case the phone’s IP is 192.168.0.102, and the window number is 0, so in a terminal on the PI the command is:
This will now direct all X Windows in my terminal session to my phone. To test things we can send the Python IDE to the phone by:
Unfortunately the Android X Server app does not support moving or resizing of X Windows, so the app is pinned to the top left. Luckily if we are writing Python apps we can set the sizing and positioning when the app starts up.
The tkinter graphic library allows you to create a simple graphic front end to your Python projects.
The following code will update a label with the time every second. The geometry setting is used to move the window (300 left, and 100 down).
# test1.py - Show the time every second # import tkinter as tk from datetime import datetime root = tk.Tk() root.geometry("+300+100") def Updatetime(): label['text'] = datetime.now().strftime("%H:%M:%S") root.after(1000,Updatetime) def CallBack(): root.destroy() label = tk.Label( root, text='', font = "Aria 72 bold" ) label.pack() B = tk.Button(root, text ="Quit", font = "Aria 72 bold", command = CallBack) B.pack() root.after(1000,Updatetime) root.mainloop()
To set the X window to my phone and run this Python application enter:
~$ export DISPLAY=192.168.0.102:0 ~$ python test1.py
I found that Python 3 was much more solid than Python 2. For example a Pi real time bars example worked perfectly on Python3, but on Python2 the bar wouldn’t update at all.