Bonjour à tous,
Je me suis installé un Cozy en auto-hébergé depuis quelques jours et après quelques ajustement, ça se passe pas trop mal.
Je commence à tester les applis mobile et desktop, et je bute sur un problème que, je pense, je n’arriverai pas à résoudre seul.
J’ai un soucis avec l’appli mobile “Cozy Drive” : la copie des photos ne se fait pas depuis mon smartphone vers mon instance Cozy.
En fait, il faudrait plutôt parler de plusieurs soucis…
Où sont les photos ?
Le premier problème est que l’appli mobile ne trouve aucune de mes photos, et du coup elle n’envoie rien (ce qui est cohérent…).
L’origine du problème est simple : l’appli mobile ne scanne pas le bon dossier. L’appli par défaut pour les photos déposent les jpeg dans un dossier nommé “DCIM/100ANDRO/”, mais l’appli Cozy recherche les photos dans le dossier “DCIM/Camera” (comme c’est indiqué dans un autre topic).
Lorsque je déplace des photos depuis le dossier “100ANDRO” vers “Camera”, l’appli Cozy les voit bien : je vois passer rapidement “n images restantes” au lancement de l’appli. On avance
Savez-vous ce qu’il est possible de faire pour ce point ? L’appli photo ne propose pas de changer le dossier de destination, j’ai uniquement le choix entre stockage interne ou externe.
Couvrez cette extension, que je ne saurais voir.
Et du coup, on arrive sur le 2nd problème : les photos ne se retrouvent pas dans mon Cozy (je parle de celles que j’ai copiées manuellement dans le dossier “Camera”).
Là, c’est un peu plus tendu. Je vais essayer d’être clair dans mes explication, mais n’hésitez pas à me demander des précisions.
Au niveau des access logs de mon Nginx, je vois passer un GET sur le chemin prévu de la photo qui renvoie un 404 (certainement pour vérifier que ce fichier n’existe pas déjà…).
Puis directement après un POST sur /settings/synchronized qui renvoie du 204. Et puis plus rien.
IP - - [27/Mar/2019:10:22:15 +0100] "GET /files/metadata?Path=%2FPhotos%2FSauvegard%C3%A9es%20depuis%20mon%20mobile%2FDSC_0001.JPG HTTP/1.1" 404 93 "-" "Mozilla/5.0 (Linux; Android 5.0; E2333 Build/26.1.B.3.109; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3683.90 Mobile Safari/537.36 io.cozy.drive.mobile-1.15.4"
IP - - [27/Mar/2019:10:22:16 +0100] "POST /settings/synchronized HTTP/1.1" 204 0 "-" "Mozilla/5.0 (Linux; Android 5.0; E2333 Build/26.1.B.3.109; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/73.0.3683.90 Mobile Safari/537.36 io.cozy.drive.mobile-1.15.4"
Au niveau des logs Android, voici un extrait qui me semble intéressant :
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 33 : ListLibraryItems plugin: calling uploadItem...
I/chromium(25282): [INFO:CONSOLE(33)] "ListLibraryItems plugin: calling uploadItem...", source: file:///android_asset/www/vendors.js (33)
W/System.err(25282): java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.startsWith(java.lang.String)' on a null object reference
W/System.err(25282): at io.cozy.plugins.listlibraryitems.ListLibraryItems$UploadFileTask.createThumbnail(ListLibraryItems.java:516)
W/System.err(25282): at io.cozy.plugins.listlibraryitems.ListLibraryItems$UploadFileTask.doInBackground(ListLibraryItems.java:327)
W/System.err(25282): at io.cozy.plugins.listlibraryitems.ListLibraryItems$UploadFileTask.doInBackground(ListLibraryItems.java:279)
W/System.err(25282): at android.os.AsyncTask$2.call(AsyncTask.java:288)
W/System.err(25282): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err(25282): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err(25282): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err(25282): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err(25282): at java.lang.Thread.run(Thread.java:818)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 33 : startMediaBackup upload item error
I/chromium(25282): [INFO:CONSOLE(33)] "startMediaBackup upload item error", source: file:///android_asset/www/vendors.js (33)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 33 : {"code":-1,"source":"/storage/emulated/0/DCIM/Camera/DSC_0001.JPG","target":"https://laurent.deltalima.net/files/b23a7cbeed5f9203f6bcd247c60d9a20?Name=DSC_0001.JPG&Type=file&Tags=library&Executable=false","message":"java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.startsWith(java.lang.String)' on a null object reference"}
I/chromium(25282): [INFO:CONSOLE(33)] "{"code":-1,"source":"/storage/emulated/0/DCIM/Camera/DSC_0001.JPG","target":"https://laurent.deltalima.net/files/b23a7cbeed5f9203f6bcd247c60d9a20?Name=DSC_0001.JPG&Type=file&Tags=library&Executable=false","message":"java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.startsWith(java.lang.String)' on a null object reference"}", source: file:///android_asset/www/vendors.js (33)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 33 : {"id":79022,"fileName":"DSC_0001.JPG","width":3920,"height":2204,"libraryId":"-1739773001","creationDate":"2019-03-27T08:19:30.000Z","filePath":"/storage/emulated/0/DCIM/Camera/DSC_0001.JPG"}
I/chromium(25282): [INFO:CONSOLE(33)] "{"id":79022,"fileName":"DSC_0001.JPG","width":3920,"height":2204,"libraryId":"-1739773001","creationDate":"2019-03-27T08:19:30.000Z","filePath":"/storage/emulated/0/DCIM/Camera/DSC_0001.JPG"}", source: file:///android_asset/www/vendors.js (33)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 33 : Raven is recording exception
I/chromium(25282): [INFO:CONSOLE(33)] "Raven is recording exception", source: file:///android_asset/www/vendors.js (33)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 33 : Backup error: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.startsWith(java.lang.String)' on a null object reference
I/chromium(25282): [INFO:CONSOLE(33)] "Backup error: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.startsWith(java.lang.String)' on a null object reference", source: file:///android_asset/www/vendors.js (33)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 8 : %c action %cMEDIA_UPLOAD_END %c@ 08:52:35.932
I/chromium(25282): [INFO:CONSOLE(8)] "%c action %cMEDIA_UPLOAD_END %c@ 08:52:35.932", source: file:///android_asset/www/vendors.js (8)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 8 : console.groupEnd
I/chromium(25282): [INFO:CONSOLE(8)] "console.groupEnd", source: file:///android_asset/www/vendors.js (8)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 8 : %c action %cOPEN_FOLDER_SUCCESS %c@ 08:52:36.780
I/chromium(25282): [INFO:CONSOLE(8)] "%c action %cOPEN_FOLDER_SUCCESS %c@ 08:52:36.780", source: file:///android_asset/www/vendors.js (8)
D/SystemWebChromeClient(25282): file:///android_asset/www/vendors.js: Line 8 : console.groupEnd
I/chromium(25282): [INFO:CONSOLE(8)] "console.groupEnd", source: file:///android_asset/www/vendors.js (8)
L’erreur de base est un NPE sur la variable “contentType” passée à la méthode “createThumbnail(…)”. Le contentType vient du mime-type de la photo, qui est lui-même renseigné lors du scan des photos avec la fonction “getMimeType(…)”. Tout porte donc à croire que c’est la fonction “getMimeType(…)” qui renvoie null. Cette fonction utilise le SDK Android pour déterminer le mime-type. Après quelques recherches, je suis tombé sur une question stackoverflow indiquant qu’il faut ajouter un “toLowerCase()” sur l’extension.
Oh, comme par hasard, ma photo est nommée “DSC_0001.JPG”. Ni une, ni deux, je te renomme le fichier et relance l’appli Cozy … et pouf ma photo arrive bien dans mon Cozy
Bref, ya peut-être quelque chose à faire dans la fonction “getMimeType(…)”.
Je serai bien tenté de vous faire un pull-request, mais j’aimerai tester le correctif avant de vous l’envoyer … sauf que je suis bien incapable de builder l’appli mobile (j’ai jeté l’éponge assez rapidement quand yarn a commencé à me parler mal).