2010-02-10 7 views
2

Est-ce que quelqu'un sait comment intégrer la nouvelle application Gallery3D (galerie Android de cooliris)? Je veux lancer cette application afin qu'elle affiche les vignettes pour seulement un dossier spécifique. Par exemple, disons que mon application télécharge des images de mon serveur et les stocke dans un dossier sur la carte SD (/ sdcard/myapp/image-cache/someid/*). Je voudrais être en mesure de faire quelque chose comme ce qui suit:Documentation du développeur de la galerie Android cooliris

// within an activity 
Uri uri = Uri.withAppendedPath(Media.EXTERNAL_CONTENT_URI, "myapp/image-cache/someid"); 
Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent); 

Merci.

+0

Je pense qu'il y a un moyen de le faire.Mettez-moi d'enquêter un peu –

+0

Avez-vous trouvé la solution? –

Répondre

1

On me dit que vous avez besoin de lancer comme ceci:

Uri targetUri = Media.EXTERNAL_CONTENT_URI; 
String folderPath = Environment.getExternalStorageDirectory().toString() + "/" + "testFolder"; 
int folderBucketId = folderPath.toLowerCase().hashCode(); 
targetUri = targetUri.buildUpon().appendQueryParameter("bucketId", folderBucketId).build(); 

Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
startActivity(intent); 

Plus d'info:

Assurez-vous que vous avez le droit chemin (cocher des barres obliques de fuite, etc.). En tant que test, vous pouvez vérifier si l'identifiant de compartiment qui sort de votre méthode est égal à l'identifiant de compartiment dans la base de données (que vous pouvez interroger à l'aide de la classe MediaProvider). Ce que vous faites maintenant est de passer la première image dans ce seau, et la galerie montre automatiquement d'autres images en vue, mais la différence est que vous essayez de voir une image, pas un seau, ce qui explique pourquoi elle ne fait pas n'apparaît pas dans une vue en miniature.

En ce qui concerne votre problème avec MediaScanner, connect() est un appel asynchrone, vous devez donc tout faire dans la méthode onMediaScannerConnected dans votre implémentation de l'interface MediaScannerConnectionClient. Vous avez déjà implémenté cette interface pour onScanCompleted, il vous suffit donc d'y mettre la logique au lieu d'interroger le MediaScannerService pour voir s'il s'est connecté.

+0

Malheureusement, cela n'a pas fonctionné pour moi.Il a affiché le dossier pour un ensemble aléatoire de photos I eu sur mon téléphone. Il est vrai que je l'ai mis en œuvre votre réponse incorrecte. j'ai réussi à trouver une solution de gros assez que je posterai pour quelqu'un d'autre qui est intéressé. – mefesto

+0

Voir mes modifications ci-dessus wrt votre solution de gros assez et continuai questions. –

+0

Ok je retravaillé les choses comme vous avez décrit. la méthode onMediaScannerConnected commence le reste de ce processus et cela fonctionne très bien. Merci beaucoup, je ne peux toujours pas le sur l'émulateur de travail chose bucketId. il semble que ça fonctionne mais sur mon téléphone, il continue d'ouvrir un dossier différent. pour être sûr que j'ai effectué une requête pour obtenir le BUCKET_ID pour la première image Uri et toujours eu le mauvais dossier. Eh bien, je peux vivre sans. – mefesto

0

Je n'ai pas réussi à obtenir l'affichage des vignettes pour un dossier en fonctionnement. Au lieu de cela, j'ai réussi quelque chose presque aussi bien en lançant la galerie sur la première image dans le dossier.

Voici une description de ce que je voulais accomplir. Un utilisateur sélectionne un enregistrement spécifique dans une vue de liste. Cet enregistrement peut avoir quelques images associées. Je voulais être capable de parcourir ces images en utilisant l'application Gallery3D cool sur le Nexus One (maintenant avec le zoom multitouch!). Si les images de cet enregistrement ne sont pas déjà mises en cache sur la carte SD de l'appareil, je les téléchargerai sous forme de fichier zip. Je puis extraire ce fichier dans un répertoire cache pour cet enregistrement sur la carte SD. Par la suite, je voulais lancer la galerie et afficher uniquement les images dans ce répertoire cache.

L'exécution du téléchargement et l'extraction du fichier zip sur la carte SD n'étaient pas un problème. Mais, pour que la galerie fonctionne, j'ai dû utiliser MediaScannerConnection avec un MediaScannerConnectionClient. Après avoir obtenu la connexion de l'analyseur (qui était en quelque sorte flakey), j'ai bouclé tous les fichiers dans le répertoire du cache en appelant scanner.scanFile. Le MediaScannerConnectionClient # onScanCompleted ajoute les uri résultants à une variable membre ArrayList. Une fois le processus terminé, je lance la galerie en passant le premier uri de cette liste. Cela afficherait la première image dans le répertoire. J'aurais préféré la vue en vignettes mais c'est assez bon.

Je ne suis pas totalement à l'aise avec cette solution. Il semble que MediaScannerConnection fonctionne de manière asynchrone, donc mon AsyncTask fait un sondage/sleep pour voir si l'analyse est terminée.

Est-ce que quelqu'un d'autre avait des problèmes avec le MediaScannerConnection ne se connectant pas sur le premier appel?Pour contourner ce que je fais quelque chose comme:

MediaScannerConnection scanner = ...; 
for (int attempts = 0; attempts < MAX_ATTEMPTS; attempts++) { 
    scanner.connect(); 
    if (scanner.isConnected()) { break; } 
    else { 
    try { Thread.sleep(5); } 
    catch (Exception e){} 
    } 
} 

if (!scanner.isConnected()) { 
    throw new IllegalStateException("Unable to establish media scanner connection!"); 
} 

laid Je sais, mais je ne sais pas pourquoi il a de la difficulté de la première connexion. : -/

MISE À JOUR: Merci à jeffamaphone, j'ai été en mesure de vider ce code moche. Maintenant, OnItemClickListener appelle simplement scanner.connect(). Le client qui est passé au constructeur de l'analyseur initialise le DownloadAsyncTask qui met à jour un ProgressDialog pendant qu'il décompresse les fichiers et appelle scanner.scanFiles (...);

1

J'ai aussi essayé le code de Jeff. il semble que cela ne fonctionne que dans l'ancienne galerie et non dans la nouvelle gallery3D.

Gallery3D actuellement ce retour dans logcat:

E/CacheService( 503): Error finding album -280923911 

et la navigation pour la source CacheService, je trouve ceci:

if (albumData != null && albumData.length > 0) { 
     DataInputStream dis = new DataInputStream(new BufferedInputStream(new ByteArrayInputStream(albumData), 256)); 
     try { 
      final int numAlbums = dis.readInt(); 
      for (int i = 0; i < numAlbums; ++i) { 
       final long setId = dis.readLong(); 
       MediaSet mediaSet = null; 
       if (setId == bucketId) { 
        mediaSet = feed.getMediaSet(setId); 
        if (mediaSet == null) { 
         mediaSet = feed.addMediaSet(setId, source); 
        } 
       } else { 
        mediaSet = new MediaSet(); 
       } 
       mediaSet.mName = Utils.readUTF(dis); 
       if (setId == bucketId) { 
        mediaSet.mPicasaAlbumId = Shared.INVALID; 
        mediaSet.generateTitle(true); 
        return; 
       } 
      } 
     } catch (IOException e) { 
      Log.e(TAG, "Error finding album " + bucketId); 
      sAlbumCache.deleteAll(); 
      putLocaleForAlbumCache(Locale.getDefault()); 
     } 
    } else { 
     Log.d(TAG, "No album found for album id " + bucketId); 
    } 

Et depuis que je reçois l'erreur "Erreur de trouver album" Au lieu de "Aucun album trouvé pour l'identifiant de l'album", cela signifie que Android trouve l'album, mais qu'il court dans une exception IOException quelque part dans ces lignes. Est-ce alors un problème de source android?

+0

Avez-vous découvert la solution? ? –

1

Oui. C'est un problème de source dans le CacheService.loadMediaSets.

La source est:

public static final void loadMediaSets(final Context context, final MediaFeed feed, final DataSource source, 
     final boolean includeImages, final boolean includeVideos, final boolean moveCameraToFront) { 
    // We check to see if the Cache is ready. 
    syncCache(context); 
    final byte[] albumData = sAlbumCache.get(ALBUM_CACHE_METADATA_INDEX, 0); 
    if (albumData != null && albumData.length > 0) { 
     final DataInputStream dis = new DataInputStream(new BufferedInputStream(new ByteArrayInputStream(albumData), 256)); 
     try { 
      final int numAlbums = dis.readInt(); 
      for (int i = 0; i < numAlbums; ++i) { 
       final long setId = dis.readLong(); 
       final String name = Utils.readUTF(dis); 
       final boolean hasImages = dis.readBoolean(); 
       final boolean hasVideos = dis.readBoolean(); 
       MediaSet mediaSet = feed.getMediaSet(setId); 
       if (mediaSet == null) { 
        mediaSet = feed.addMediaSet(setId, source); 
       } else { 
        mediaSet.refresh(); 
       } 
       if (moveCameraToFront && mediaSet.mId == LocalDataSource.CAMERA_BUCKET_ID) { 
        feed.moveSetToFront(mediaSet); 
       } 
       if ((includeImages && hasImages) || (includeVideos && hasVideos)) { 
        mediaSet.mName = name; 
        mediaSet.mHasImages = hasImages; 
        mediaSet.mHasVideos = hasVideos; 
        mediaSet.mPicasaAlbumId = Shared.INVALID; 
        mediaSet.generateTitle(true); 
       } 
      } 
     } catch (IOException e) { 
      Log.e(TAG, "Error loading albums."); 
      sAlbumCache.deleteAll(); 
      putLocaleForAlbumCache(Locale.getDefault()); 
     } 
    } else { 
     if (DEBUG) 
      Log.d(TAG, "No albums found."); 
    } 
} 

lecture de (hasImages et hasVideos) à partir des métadonnées de l'album manque. Mettre deux lignes

dis.getBoolean(); 
    dis.getBoolean(); 

dans la boucle après mediaSet.mName = Utils.readUTF(dis); va résoudre le problème, mais personne ne le fera. Donc, évidemment, à cause du bogue dans le code source, il est impossible d'afficher le bucket (répertoire) spécifié dans la Gallery. :(

+0

La méthode getBoolean() n'est pas définie pour le type DataInputStream. Comment puis-je le réparer? Merci –

Questions connexes