Aller au contenu

API Photoshop : ptit défaut...


Nivek

Recommended Posts

J'ai rajouté une fonction d'édition de photo à mon créateur d'album... je teste avec l'appli Photoshop Android, ca marche très bien sauf que... Photoshop n'est pas capable de rééditer le résultat qu'il a renvoyé !

En fait, l'appli prend en entrée des Uri en content:// mais fournit en sortie du file://... qu'elle ne sait pas reprendre en entrée. C'est ballot :P

Lien vers le commentaire
Partager sur d’autres sites

Bon ben j'ai fini par trouver un contournement à ce que je considère comme un bug de l'appli Photoshop android...

Petit récapitulatif :

* L'appli Photoshop accepte les intents ACTION_EDIT sur les mimetypes image/*... mais uniquement pour les uri dont le scheme (ou protocole) est de type 'content' (content://...).

* Le résultat fourni par l'appli Photoshop est une Uri vers l'image modifiée... qui débute par file://... donc impossible de refournir le résultat à Photoshop pour réédition. On imagine alors 2 possibilités :

- Implémenter un ContentProvider... si c'est juste pour refiler à Photoshop ses propres résultats, c'est quand même beaucoup pour pas grand chose.

- Restocker le résultat dans le MediaStore pour obtenir une Uri du MediaStore en content://... j'ai essayé pour vous, le résultat est étonnant : l'image est en double dans la gallerie !

Conclusion : Photoshop fait la moitié du boulot: il stocke son résultat dans le MediaStore, mais 'oublie' de nous retourner l'Uri correspondante et préfère nous refourguer une Uri en file://... Moi j'appelle ça un bug. Du coup le contournement que j'ai implémenté est le suivant : rechercher dans le MediaStore l'image que Photoshop a stockée.

   public static Uri getContentUriFromFile(Context ctx, File imageFile) {
       Uri uri = null;
       ContentResolver cr = ctx.getContentResolver();
       // Columns to return
       String[] projection = { Images.Media._ID, Images.Media.DATA };
       // Look for a picture which matches with the requested path
       // (MediaStore stores the path in column Images.Media.DATA) 
       String selection = Images.Media.DATA + " = ?";
       String[] selArgs = { imageFile.toString() };

       Cursor cursor = cr.query(sStorageURI, projection, selection, selArgs,
               null);

       if (cursor.moveToFirst()) {
           int idColumn = cursor.getColumnIndex(Images.Media._ID);
           String id = cursor.getString(idColumn);

           uri = Uri.withAppendedPath(sStorageURI, id);
       }
       cursor.close();
       if (uri != null) {
           Log.d(LOG_TAG, "Found picture in MediaStore : "
                   + imageFile.toString() + " is " + uri.toString());
       } else {
           Log.d(LOG_TAG, "Did not find picture in MediaStore : "
                   + imageFile.toString());
       }
       return uri;
   }

Cette méthode devrait être appelée de la façon suivante, à la réception du résultat de l'Activity Photoshop :

   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       switch (requestCode) {
       case ACTIVITY_EDIT_PICTURE:
           if (resultCode == Activity.RESULT_OK)
           {
               Uri editedPictureUri = data.getData();
               if(editedPictureUri.getScheme().startsWith(ContentResolver.SCHEME_FILE)) {
                   // Workaround to make Photoshop.com android app able to re-edit its results
                   File imageFile = new File(editedPictureUri.getPath());
                   Uri editedPictureContentUri =BitmapUtil.getContentUriFromFile(getApplicationContext(), imageFile); 
                   if(editedPictureContentUri != null) {
                       editedPictureUri = editedPictureContentUri;
                   }
               }

               // Now you can store the editedPictureUri in your data model
               ...

           }
       default:
           break;
       }
   }

De cette façon, le jour où Photoshop finit par renvoyer du content://, le contournement ne sera plus utilisé.

Voilà, je ne sais pas si cela va servir à beaucoup de monde, mais pour ceux que ça intéresse, vous gagnerez un peu de temps.

Si vous avez besoin de précisions en plus, n'hésitez pas à demander ;)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...