Android Digital Photo Frame
When you start the slideshow, just touch the image, to pause the slideshow and to reveal more controls:
The upper bar shows the following action buttons:
The lower bar with the up-arrow will reveal the detailed EXIF data upon touch.
The purchase is tied to your Google Play account. Therefore, you can factory-wipe your phone and reinstall it from scratch - as long as it’s tied to your Google Play account the PhotoCloud should remain activated.
There are two separate one-time purchases possible for this app:
The app should be automatically activated on all of your devices connected to the same Google account. You definitely do not need to purchase the app separately per device; a single purchase from one device should unlock the app on all devices connected to that Google account.
Troubleshooting:
Settings / About and scroll
the About screen to the bottom:
This error:
Billing error #5 Developer Error: Invalid argument provided to the API. This error can also indicate that the application was not correctly signed or properly setup for In-app Billing. in Google Play or does not have the necessary permissions in its manifest: java.lang.Throwable:Client is already in the process of connecting to billing service.
Currently there is no known solution, apart from making sure that you have the newest Google Play installed on your phone.
There are two ways to achieve this:
Just touch the Stream icon, located to the left corner of the Stream card.
The main screen listing four stream cards:
You will be able to check multiple streams; then just touch the upper-right Start Slideshow button to start slideshow from all of those streams.
Open the main screen and touch the lower big white plus button. You will be able to add additional streams.
Touch the upper-right cog wheel Settings button in the main screen. You can for example configure to start slideshow from a Stream (or a combination of Streams)
And others.
To remove all widgets, please make sure all of the following settings are off:
See Issue 119 for more details.
When launching a slideshow, a photo is downloaded from the server only if there’s no cached version or if the cached version is too old. If the photo exists on the server, it is cached and displayed. If the photo no longer exists on the server, it is removed from the cache.
So, the cache is updated/cleared only gradually, as the slideshow is running.
The definition of “too old” depends on the Short-Lived Cache setting:
Off = a photo is old if it has been downloaded from the server 30 days ago or earlier.On = a photo is old if it has been downloaded from the server 1 day ago (yesterday) or earlier.On Android 9 and older, PhotoCloud can start the slideshow when your device boots up, turning your device into a photo frame. On Android 10 and newer it can’t, see below.
On Android 9 and older this tends to be tricky, therefore please make sure to revisit all of the following items:
RECEIVE_BOOT_COMPLETED to the app
and the app will not start. This is a built-in Android security measurement and there’s nothing PhotoCloud can do.RECEIVE_BOOT_COMPLETED permission is enabled for PhotoCloud and that your phone haven’t accidentally removed that permission.
Typically you open the list of installed apps, find PhotoCloud and you can find the permissions there. However, this may differ on certain phones; please follow your phone’s permission manager
tutorial to review the permissions.Android 10 and newer block apps from opening a screen while they run in the background, and an app woken up by the boot runs in the background. The only way around it is the “Display over other apps” permission. PhotoCloud never draws over other apps, and that permission is a favourite of scam apps, so PhotoCloud doesn’t ask for it. That’s why the “Auto-start Slideshow on Boot” settings are greyed out on Android 10 and newer.
Instead:
adb shell settings put secure screensaver_components sk.baka.photoframe/.frame.DaydreamService
adb shell settings put secure screensaver_enabled 1
adb shell settings put secure screensaver_activate_on_sleep 1
The last line starts it while charging; adb shell settings get secure screensaver_components shows the current pick.
Starting the slideshow when the power cable is plugged in doesn’t work on Android 10 and newer either, for the same reason, so “Auto-start Slideshow on Power Connected” is greyed out there too; the screen saver and Tasker work there. “Auto-stop Slideshow on Power Disconnected” works on every Android version. Please see Issue #176 and Issue #185 for more details.
You can use the Tasker app to start the slideshow in any way you need: on boot-up, when the power cable is plugged in, at a certain time of day, and so on.
sk.baka.photoframe.frame.PhotoFrameActivity).If the slideshow is already running in the background, Launch App brings it to the front.
NOTE: Don’t use Tasker’s Send Intent action with sk.baka.photoframe.START_SLIDESHOW, which older versions of this FAQ
recommended. It doesn’t work on Android 10 and newer: PhotoCloud receives that intent in the background,
and Android doesn’t allow it to open the slideshow from there.
Most often PhotoCloud crashes because Android doesn’t give PhotoCloud enough memory to hold the images in. You can verify this, by going into Settings / About
and scrolling to the System Stats. On my phone, Android says that it gives PhotoCloud 512 MB of memory, however on low-cost/older phones this number might be
dramatically lower.
For a FullHD screen, the photo is shrank to 1920x1080 and since we have RGBA model which takes 4 bytes per every pixel, such a photo requires 1920x1080x4 = 8294400 bytes = whopping 8MB of memory (RAWs take even more space since they don’t support automatic shrink on load and are loaded as-they-are into memory, then resized). PhotoCloud may at any time require to have 4 images loaded in memory:
Therefore, PhotoCloud requires at least 32MB of memory only for images, plus the app itself uses a bit of memory for views and bookkeeping. Therefore, PhotoCloud requires at least as a bare minimum 48MB of memory on 1080P/FullHD device; not to mention that the garbage collector is pretty shitty on Androids since it will fragment the internal memory and at some point will fail to allocate 8MB of continuous space. The more memory PhotoCloud has, the better; PhotoCloud won’t use all of the memory itself, but more memory prevents fragmentation.
If your phone allocates less than 48MB memory to PhotoCloud, or if it so happens that PhotoCloud crashes randomly (probably because of memory fragmentation), you can work-around
this issue by letting PhotoCloud downscale the image more aggresively. By enabling the Settings / Screen / Load with Half Resolution, you will force PhotoCloud
to load the images at half of the resolution, taking up 4x less memory. For example, on a 1080p device, the images will be loaded at the resolution of 960x540,
which will cause them to take only 2073600 bytes (2MB). The disadvantage is that the images will not look as sharp, they will look a little blurred. But, I guess
it beats having PhotoCloud crashing all the time.
PhotoCloud logs what it is doing, to a standard Android log. If PhotoCloud does not work properly or keeps crashing, please open a bug report at PhotoCloud Bug Tracker. During our conversation, I may ask for a log produced by PhotoCloud. Please follow the following steps to obtain the crash stack trace:
adb devices from command line - you should see your deviceadb logcat to get the logcatCaution: the log may contain sensitive information such as phone numbers you have dialed etc. Make sure to paste only the stack trace into the Github issue, with sensitive info (file names) starred out. The most important part is the crash information itself, or an exception stack-trace as it is called. It looks like this:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: sk.baka.photoframe, PID: 11590
java.lang.RuntimeException: Unable to instantiate application sk.baka.photoframe.App: java.lang.RuntimeException: Simulated
at android.app.LoadedApk.makeApplication(LoadedApk.java:823)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5522)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1576)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:6274)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.RuntimeException: Simulated
at sk.baka.photoframe.App.<init>(App.java:71)
at java.lang.Class.newInstance(Native Method)
at android.app.Instrumentation.newApplication(Instrumentation.java:1008)
at android.app.Instrumentation.newApplication(Instrumentation.java:993)
at android.app.LoadedApk.makeApplication(LoadedApk.java:817)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5522)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1576)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:6274)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
You can easily find such exceptions simply by searching for sk.baka.photoframe throughout the log.
PhotoCloud uses Google Play one-time subscriptions. On certain Smart TVs the Google Play seems to be broken or doesn’t work: I know of TCL Smart TVs not able to use subscriptions. There has been also this TCL Smart TV Subscription Error Report which suggests that the issue is not in PhotoCloud app itself, but rather in the Smart TV and/or Google Play.
PhotoCloud should always report any payment error as an Android toast, and it should also report “In-app purchase service is not available on this device :(“ if Google Play is non-functional or completely missing.
Please make sure that you have the newest PhotoCloud installed from Google Play, since a newer version may contain in-app-purchases fixes and workarounds.
This error comes from PhotoCloud 1.14.x running on Android 4.4, when it connects over https to a server that accepts only TLS1.2 or newer: Android 4.4 doesn’t enable TLS1.2 for apps.
PhotoCloud 1.15.0 and newer require Android 5.0, which enables TLS1.2 by default, so a supported device no longer gets this error. On Android 4.4 the solution is to either use plain http to your OwnCloud/NextCloud server, or use a newer device.
Please read more at Nextcloud connecton failes with SSLv3 error.
The full error message reads:
Failed to connect. Please make sure that the server is running, is accessible from your phone and your OwnCloud config.php's
trusted_domain list contains 'xxx'.
Error. java.io.IOException: list / failed: -1: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL
handshake aborted: ssl=0x6cb36970: Failure in SSL library, usually a protocol error.
error 14077410:SSL routines: SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741
0x6a45d74:0x00000000)
You can get the same exception in the Weather widget: “Err SSLHandshakeException Handshake Failed”. This exception started to manifest in roughly July 2023, when OpenWeatherMap (the source of weather data for PhotoCloud) dropped support for TLS1.1, which hit Android 4.4 devices. On Android 5.0 and newer, the weather’s handshake failure is most likely the “Trust anchor” one below, which a newer PhotoCloud fixes.
Also see the Discussion Thread for more details.
A different handshake failure hits devices that do support TLS1.2: the device doesn’t trust the
certificate authority that signed the server’s certificate. The error usually reads
SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
The usual culprit is Let’s Encrypt, which signs the weather icons from openweathermap.org, iCloud web albums and many self-hosted Nextcloud/OwnCloud servers. Older Android versions (and some vendor forks such as Fire OS) don’t know Let’s Encrypt’s root certificates ISRG Root X1 and X2, and the old cross-signature that used to cover them has expired.
PhotoCloud versions newer than 1.15.8 bundle both Let’s Encrypt roots and trust them on every Android version, so please upgrade. If the error persists, please open an issue with the full error message.
PROXY_ENABLE_BASIC_AUTH=true.PhotoCloud 1.17.0 also shows photos from any WebDAV server, such as a Synology or QNAP NAS: add a “Nextcloud / ownCloud / WebDAV” stream with the URL of the folder. For Synology, see Synology NAS & Synology Photos.
This happens when you try to access SSH (secure shell, a secure way to send commands to remote machine) which has SFTP disabled. SFTP stands for Secure File Transfer Protocol, works over SSH, and without it, SSH can not transfer files. Please make sure SFTP is enabled on your server.
Synology offers no public API for Synology Photos, but Synology Photos keeps its photos in ordinary folders on the NAS, and PhotoCloud can show them straight from those folders.
https://<NAS address>:5006/photohttps://<NAS address>:5006/home/Photoshttps://192.168.1.10:5006/photo/2024PhotoCloud sees folders, not Synology Photos albums: an album lives only in Synology Photos’ own database, which WebDAV doesn’t expose. Keep each album in its own folder to get the same result.
PhotoCloud 1.16.0 and older can read the same folders over Samba (DSM: Control Panel → File Services → SMB) or SFTP (Control Panel → File Services → FTP → SFTP).
Some users received “Synology DS218j DS218j 6.2-25556 does not provide content directory and is thus not browsable for photos”
when accessing Synology Diskstation via DLNA. The problem is that Synology doesn’t offer the urn:schemas-upnp-org:service:ContentDirectory:*
DLNA service which is required for photo browsing. If you know another DLNA way of retrieving photos, please open a ticket
and let me know.
Known workaround is to access your photos over SSH instead; please make sure to also enable SFTP as discussed above.
Large photos look blurry over DLNA. The Media Server may be sending a scaled-down copy:
PhotoCloud 1.16.0 and older also picked a copy smaller than the screen when the photo was much larger than it; the release after 1.16.0 picks the smallest copy that still fills the screen. If photos still look blurry, use WebDAV instead: it always downloads the original photo.
The “Folders” and “Moments” feature uses an internal filtering/photo retrieval mechanism of Android which is very complicated and hard to call correctly. If those two don’t work on your device, just go to the “Phone Memory” folder. It uses a simple file-based access to your phone’s photos and should always work.
Google Play allows for some apps and games to be shared amongst all members of your family. Unfortunately, PhotoCloud is not eligible for the Google Family Library program since:
A purchase unlocks PhotoCloud only for the Google account that made it. To unlock a family member’s tablet or TV serving as a photo frame, either buy the In-App Product with the Google account logged in to that device, or add the buyer’s Google account to the device (Android Settings → Accounts → Add account) and pick that account in Google Play. See Issue #151 for more details.