Guides

How to set up Art Frame TV as your screensaver

Installing Art Frame TV takes a minute. Making it the screensaver takes one extra step, because Google TV keeps its own Ambient Mode in the way. This guide covers every route, starting with the ones that need no computer, and the fixes for the errors that stop people on the ADB route.

Updated For Google TV & Android TV

Which route do you need?

Install Art Frame TV from Google Play on the TV and open it once. Then check Settings → Device Preferences → Screen saver.

  • Art Frame TV is in that list: select it. You are done.
  • There is no Screen saver menu, only Ambient mode (most Google TV devices): Google does not let Ambient mode use other apps. Use a launcher (route 1) or ADB (route 2).

Use version 1.0.5 or later. Earlier versions close the screensaver the moment it starts, so update from Google Play first.

You never have to set the screensaver up to use the app. It works fully from its own icon; the screensaver is for when you want the frame to appear by itself once the TV goes idle.

Route 1: a launcher with Screensaver Override

No computer, no terminal, and no pairing. Replacement launchers such as Projectivy Launcher or FLauncher add the screensaver choice that Google TV hides.

  1. Install the launcher from Google Play and make it the home screen when asked.
  2. Open its settings and find Screensaver Override.
  3. Choose Art Frame TV Screensaver.

The trade-off is that you are changing your home screen. If you would rather not, use route 2.

Route 2: ADB over Wi-Fi

ADB is Android's developer tool. You run it once, on a computer that is on the same Wi-Fi network as the TV, and the setting then stays on the TV.

1. Install ADB on your computer

ADB ships in Google's platform-tools. Pick the line for your system and run it in a terminal:

# macOS (Homebrew)
brew install --cask android-platform-tools

# Windows (PowerShell)
winget install Google.PlatformTools

# Debian / Ubuntu
sudo apt install adb

Open a new terminal window and check it worked:

adb version

If you see command not found: adb, see the fixes below.

2. Turn on Wireless debugging on the TV

Go to Settings → System → About and click Android TV OS build seven times. Developer options now appear under Settings → System. Open them and turn on Wireless debugging.

3. Pair (once)

Wireless debugging will not talk to a computer until the two are paired. On the TV, open Wireless debugging → Pair device with pairing code. A dialog shows an address with a port, and a six-digit code. Keep it open, and on the computer run:

adb pair 192.168.1.50:37215 123456

Use your address, port and code from the dialog; the numbers above are examples. Do not type the angle brackets or placeholder words from other guides. You should see Successfully paired. The port and code are temporary: they change every time the dialog opens.

4. Connect

Close the pairing dialog. The main Wireless debugging screen shows IP address & Port, a different port from the pairing one. It is not 5555.

adb connect 192.168.1.50:41234
adb devices

The device should be listed as device. If the TV asks Allow debugging?, accept it.

5. Set the screensaver

adb shell settings put secure screensaver_components team.dsa.artframetv/.service.ArtFrameDreamService
adb shell settings put secure screensaver_enabled 1

Check that it stuck:

adb shell settings get secure screensaver_components

That should print team.dsa.artframetv/.service.ArtFrameDreamService. To see it straight away, use Start now in your TV's screensaver menu (on Google TV it is under Ambient screensaver). If Start now does nothing, go to the next section.

The setting survives restarts. A system update can reset it, in which case run the two settings put lines again. To undo it, run adb shell settings delete secure screensaver_components.

If Start now does nothing (TCL and some other brands)

Some manufacturers add their own gatekeeper that refuses to start any app in the background unless it has been given an auto-start permission. The screensaver is exactly that: the TV starts it for you. TCL TVs do this, and so can others. The signs are that the settings above are correct, Start now does nothing, and the screensaver never appears when the TV idles.

With ADB connected (steps 1 to 4), grant the permission:

adb shell appops set team.dsa.artframetv AUTO_START allow
adb shell appops get team.dsa.artframetv AUTO_START

The second command should print AUTO_START: allow. Then press Start now again. If the TV answers Unknown operation, it has no such permission and this is not your problem. Look in the TV's own settings for an Auto-start or App permissions screen and allow Art Frame TV there.

If you are comfortable reading logs, this confirms the diagnosis. Run adb logcat -c, press Start now, then adb logcat -d | grep -i "forbid bind". A line mentioning Unable to bind dream service means the TV refused to start it.

When ADB fails

command not found: adb

The tools are not on your PATH, or your terminal opened before they were installed. Close the terminal, open a new one and try adb version again. Terminals that were already open do not notice newly installed commands.

no such file or directory: tv-ip

You typed a placeholder literally. In many guides <tv-ip> stands for your TV's address, and the shell reads the < as a file redirect. Replace the whole thing, brackets included, with the address from the TV.

error: protocol fault on adb pair

The pairing handshake did not complete. Try these in order, and after each one reopen Pair device with pairing code on the TV so you have a fresh port and code, because each code works for one attempt only:

  1. Use the pairing port. It is the one in the pairing dialog, not the one on the main Wireless debugging screen. Type it straight after the address, then the code when asked.
  2. Restart the ADB server. A stale background process is the most common cause. Run
    adb kill-server
    then pair again. The server restarts by itself.
  3. Keep the TV awake. If the dialog closes or the screen sleeps, the code is gone.
  4. Security software. If it still fails while nc -z reaches the port, use the relay in the section below.

A wrong code usually reports a plain failure to pair instead.

failed to connect … No route to host

Despite the wording, this is rarely a real routing problem, especially if the TV answers ping. Work through these in order:

  1. Not paired yet. Do step 3 first. Connecting an unpaired computer fails.
  2. Stale port. The connect port changes whenever Wireless debugging is switched off and on, and sometimes after a restart. Read it again from the TV.
  3. Different network. The computer and TV must be on the same network. Guest Wi-Fi and some mesh systems isolate devices from each other.
  4. Security software. See below.

Security software blocks only ADB

Some VPNs and antivirus suites filter network traffic per application. They can block adb while ping and everything else works. You can tell it is happening if a plain connection to the TV's port succeeds but ADB fails:

nc -z -v 192.168.1.50 41234     # macOS / Linux
adb connect 192.168.1.50:41234

If nc says succeeded and ADB says No route to host, the network is fine and something is filtering ADB. Pausing the filter works, but the filter is often a system extension that keeps running after you disconnect a VPN, so it may need to be switched off in the security software itself. If you would rather leave it on, forward the ports through Python, which these filters normally allow. Save this as relay.py:

import socket, sys, threading

host = sys.argv[1]

def pipe(src, dst):
    try:
        while True:
            data = src.recv(65536)
            if not data:
                break
            dst.sendall(data)
    except OSError:
        pass
    finally:
        for s in (src, dst):
            try:
                s.shutdown(socket.SHUT_RDWR)
            except OSError:
                pass

def serve(local, remote):
    srv = socket.socket()
    srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    srv.bind(("127.0.0.1", local))
    srv.listen(8)
    while True:
        client, _ = srv.accept()
        try:
            upstream = socket.create_connection((host, remote), 5)
        except OSError:
            client.close()
            continue
        threading.Thread(target=pipe, args=(client, upstream), daemon=True).start()
        threading.Thread(target=pipe, args=(upstream, client), daemon=True).start()

for pair in sys.argv[2:]:
    local, remote = map(int, pair.split(":"))
    threading.Thread(target=serve, args=(local, remote), daemon=True).start()
threading.Event().wait()

Run it with the TV's address, then one local:remote pair for the pairing port and one for the connect port, and leave it running:

python3 relay.py 192.168.1.50 55001:37215 55002:41234

In a second terminal, use 127.0.0.1 and the local ports in place of the TV's address:

adb pair 127.0.0.1:55001 123456
adb connect 127.0.0.1:55002

Everything from step 5 then works as normal. Stop the script with Ctrl+C when you are done.

Common questions

Do I have to set Art Frame TV as the screensaver?
No. The app works fully from its own icon. The screensaver only matters if you want the frame to appear by itself when the TV goes idle.
What is the easiest way to set it as the screensaver on Google TV?
A launcher with a screensaver override, such as Projectivy Launcher or FLauncher. Install it, open Screensaver Override in its settings and choose Art Frame TV Screensaver. It needs no computer.
Why does adb connect say No route to host?
Usually because the computer has not been paired with the TV yet, the Wireless debugging port has changed, or security software is blocking ADB specifically. It is rarely a genuine network fault.
Why does adb pair say protocol fault?
You almost certainly used the wrong port. adb pair needs the port shown in the Pair device with pairing code dialog, which is different from the port on the main Wireless debugging screen, and it changes every time the dialog opens.
Is port 5555 right for Wireless debugging?
No. Wireless debugging on Android 11 and later uses a random port for pairing and another random port for connecting. Port 5555 belongs to the older USB-then-tcpip method.
Why does Start now do nothing on my TCL TV?
TCL's auto-start manager blocks apps from starting in the background unless they have the AUTO_START permission. Connect with ADB and run adb shell appops set team.dsa.artframetv AUTO_START allow, then press Start now again.
Does it need root, and can I undo it?
It does not need root. The command only writes a normal secure setting. To undo it, run adb shell settings delete secure screensaver_components, or choose another screensaver in the TV's settings.

Art Frame TV puts your photos and gallery classics inside photorealistic frames with real passe-partout matting, on Google TV and Android TV. Free, no account, no ads. See how it works →

More guides