Nivek Posté(e) 13 mars 2010 Share Posté(e) 13 mars 2010 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 More sharing options...
Nivek Posté(e) 14 mars 2010 Auteur Share Posté(e) 14 mars 2010 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 More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.