immich icon indicating copy to clipboard operation
immich copied to clipboard

GPS data not being parse by immich from android

Open anytimesoon opened this issue 1 year ago • 6 comments

The bug

None of my images uploaded from my phone or my partner's phone have the location data parsed by immich. I have checked that these images have GPS data using the phone's gallery app. I have also tried rerunning the metadata job

The OS that Immich Server is running on

Ubuntu 22.04 lts

Version of Immich Server

1.108.0

Version of Immich Mobile App

1.108.0

Platform with the issue

  • [X] Server
  • [ ] Web
  • [X] Mobile

Your docker-compose.yml content

#
# WARNING: Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
#

name: immich
services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - 2283:3001
    depends_on:
      - redis
      - database
    restart: always
    labels:
      - com.centurylinklabs.watchtower.monitor-only=true
  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
    labels:
      - com.centurylinklabs.watchtower.monitor-only=true
  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine@sha256:d6c2911ac51b289db208767581a5d154544f2b2fe4914ea5056443f62dc6e900
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always
    labels:
      - com.centurylinklabs.watchtower.enable=false
  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: --data-checksums
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' || exit 1; Chksum="$$(psql
        --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only
        --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM
        pg_stat_database')"; echo "checksum failure count is $$Chksum"; [
        "$$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m
    command:
      - postgres
      - -c
      - shared_preload_libraries=vectors.so
      - -c
      - search_path="$$user", public, vectors
      - -c
      - logging_collector=on
      - -c
      - max_wal_size=2GB
      - -c
      - shared_buffers=512MB
      - -c
      - wal_compression=on
    restart: always
    labels:
      - com.centurylinklabs.watchtower.enable=false
volumes:
  model-cache: null
networks: {}

Your .env content

IMMICH_VERSION=v1.108.0
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Reproduction steps

1. Take picture with android phone, making sure GPS is switched on and the camera tags the image
2. Have the app upload the file to the server

Current behaviour:
GPS data is not parsed

Expected behaviour:
GPS data should be visible in the details section of the image

Relevant log output

No response

Additional information

No response

anytimesoon avatar Jul 22 '24 08:07 anytimesoon

Does the app have location access permissions?

bo0tzz avatar Jul 22 '24 08:07 bo0tzz

It does Screenshot_20240722-104633

anytimesoon avatar Jul 22 '24 08:07 anytimesoon

Can you download the original file from the Immich server and check with exiftool or such whether it has the GPS data, and do the same with a copy of the file copied manually off your phone?

bo0tzz avatar Jul 22 '24 09:07 bo0tzz

Downloading the file from immich, it seems it does not have any GPS data.

I'm not sure I understand what your request with this

and do the same with a copy of the file copied manually off your phone?

I think you would like me to confirm that the file had GPS data before the upload to immich. If this is the case, yes the original file has GPS data.

From this, it seems like the data has been stripped from the file during the upload process

anytimesoon avatar Jul 22 '24 12:07 anytimesoon

Can you try turning off background upload, taking a new photo with gps data, then uploading that in the Immich app with the foreground upload mechanism?

bo0tzz avatar Jul 22 '24 13:07 bo0tzz

I have tried this, and still no GPS

anytimesoon avatar Jul 22 '24 17:07 anytimesoon

I have the same issue. It worked before flawlessly (even without having granted Immich app location permission), but since around two weeks, metadata isn't parsed properly from both my phone (Pixel 6 with latest CalyxOS - Android 14 and microG as well as app version 1.111.0 from github release page) as well as my wife's phone (Pixel 4 with latest GrapheneOS - Android 14 with sandboxed Google Play Services and app version 1.109.2 from F-Droid). Uploading from web interface works properly, but both devices will backup duplicates (without location tags) of the pictures to the server if I upload my pictures through the web interface and keep auto backup through mobile app activated. I tried an older device (Samsung Galaxy S8 running LineageOS - Android 11 with microG and app version 1.109.2), where it still works flawlessly. Server is running v1.110.0.

So I am a little bit confused right now what might be the underlying issue here. And yes, I am aware that since Android Q EXIF data will be stripped from media files when shared and proper permissions aren't granted to the sharing app (especially the "access all files" permission, which Immich mobile app didn't request in the first place and can't be granted manually as it doesn't ask for it).

I tried different app versions, the issue still persists.

orville87 avatar Jul 31 '24 13:07 orville87

For me the issue is definitely calyxos, since they recently made the location redaction feature more restrictive. So disabling the feature altogether fixed it for me. There is a global toggle at settings -> Security & privacy -> More security & privacy -> Redact location data when sharing media.

AMstuff avatar Aug 03 '24 17:08 AMstuff

Sadly, this hasn't worked for me. It's interesting to learn that others who face this issue are using Calyx. That does imply that the problem may stem from there

anytimesoon avatar Aug 04 '24 10:08 anytimesoon

I have the same problem, I'm using calyxos too. After some research in the flutter_photo_manager lib used by immich, I found that the location isn't set in the AssetEntity (cf. https://github.com/fluttercandies/flutter_photo_manager/blob/044ee31d8569341d0feb6772315f4c6b89c9e5c9/android/src/main/kotlin/com/fluttercandies/photo_manager/core/utils/IDBUtils.kt#L226 and the comment https://github.com/fluttercandies/flutter_photo_manager/blob/044ee31d8569341d0feb6772315f4c6b89c9e5c9/lib/src/types/entity.dart#L482) According to the comments in the library, we should use latlngAsync function to get location. Maybe I missed something because the location sync seems to work on android (without calyxos), but I didn't find any usages of latlngAsync.

I tried to use my own version of flutter_photo_manager that defined latitude and longitude values directly in AssetEntity and it works, but I'm not sure that is a good solution. I'm not flutter or mobile developer, so if someone wants to help me your welcome :)

The code I'm using to define the location :

// com.fluttercandies.photo_manager.core.utils.IDBUtils#toAssetEntity
var latitude: Double? = null
var longitude: Double? = null
context.contentResolver.openInputStream(getUri(id, getMediaType(type)))?.use {
    val exifInterface = ExifInterface(it)
    val latLong: FloatArray = kotlin.FloatArray(2)
    if (exifInterface.getLatLong(latLong)) {
        latitude = latLong[0].toDouble()
        longitude = latLong[1].toDouble()
    }
}

PaulienM avatar Aug 04 '24 15:08 PaulienM

It'd be nice if Immich implemented the media permission so that this doesn't happen, it does manage media afterall

lucasmz-dev avatar Aug 07 '24 23:08 lucasmz-dev

I'm facing the same problem, that location data is removed. And I also have Calyxos. Is there a workaround? Deactivation the redaction feature as mentioned in https://github.com/immich-app/immich/issues/11280#issuecomment-2267078351 did not help.

avanc avatar Aug 29 '25 13:08 avanc

In addition to deactivate redaction, Immich also needs location rights (Android Settings -> Apps -> Immich -> Permissions)

avanc avatar Aug 29 '25 16:08 avanc

@avanc existing media already uploaded to Immich would not suddenly get their GPS data unfortunately AFAIK. I use ente and it doesn't there at least. I don't see why it would need location permission, that isn't an usual Android thing.

lucasmz-dev avatar Aug 30 '25 08:08 lucasmz-dev

I had this problem too on my CalyxOS phone. Ente Photos also has the same problem, but it can show all EXIF data in a list, and I could see that the GPS coordinates are all zeros.

It turns out that its indeed the "Redact location data when sharing media" setting at play here. Turning it off did not change anything immediately, but after a reboot both Ente Photos shows the EXIF data and Immich could now upload the image along with location information.

But thats not everything. The "Redact location data when sharing media" permission has this description:

Only galleries and file managers may read location metadata from your photos and media. (Third-party apps must have All Files Access or Media Management permissions.)

So it should just work, right? (Though what does Media Management permissions mean is unclear to me.) There are 2 things that could mean thats not the case.

First, the android developer documentation says the ACCESS_MEDIA_LOCATION permission needs to be asked separately. For me this is already granted, but probably only because I granted location permission manually. Second, it also says that even with ACCESS_MEDIA_LOCATION permission the image needs to be read in a special way to get unredacted location information, which is demonstrated in an example.

mpeter50 avatar Sep 17 '25 05:09 mpeter50

Can we somehow update the metadata of already uploaded images, without deleting all of them?

mpeter50 avatar Sep 17 '25 05:09 mpeter50

I think I figured it out. Both Immich and Ente Photos request the "Media Management" permission, but there is no pop up for it to ask the user whether to allow it, instead it can only be granted in "Settings > Apps > Special app access > Media management apps". This controls the android.permission.MANAGE_MEDIA permission that the "Redact location data when sharing media" setting refers to.

If I grant this permission for these apps, then both Immich and Ente Photos will be able to access the GPS coordinates in any of the photos, even with "Redact location data when sharing media" being enabled. So users can do this once manually and it will work as expected.

Apparently this permission was introduced in Android 12: https://developer.android.com/about/versions/12/features#storage But it seems originally it is only used for controlling whether the app can delete images without user confirmation, and maybe Calyx and Graphene extended the meaning of it.

Well, I cant determine if its Immich or the ROM devs who should fix their code. But I can understand ROM devs who made this change, because ACCESS_MEDIA_LOCATION in itself is ineffective: its granted by default, and does not even have a toggle anywhere, while MANAGE_MEDIA is not granted by default. And it makes sense that an app like Immich should directly request this permission. Especially because according to the docs, this is also needed for it to be able to delete already backed up images without user confirmation.

mpeter50 avatar Sep 17 '25 06:09 mpeter50