Android cooliris gallery开发人员文档

时间:2010-02-10 17:06:42

标签: android image gallery cooliris

有谁知道如何与新的Gallery3D应用程序(cooliris android gallery)集成?我想启动该应用程序,以便仅显示特定文件夹的缩略图。

例如,假设我的应用程序从我的服务器下载图像并将它们存储在SD卡上的文件夹中(/ sdcard / myapp / image-cache / someid / *)。我希望能够做到以下几点:

// 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);

感谢。

4 个答案:

答案 0 :(得分:1)

我被告知你需要像这样启动它:

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);

更多信息:

确保您拥有正确的路径(检查尾部斜杠等)。作为测试,您可以检查从您的方法中出来的存储桶ID是否等于数据库中的存储区ID(您可以使用MediaProvider类查询)。

您现在正在做的是传递该存储桶中的第一个图像,并且图库会自动显示其他图像,但区别在于您正在尝试查看图像,而不是存储桶,这就是为什么它不会t以缩略图视图显示。

就MediaScanner问题而言,connect()是异步调用,因此您应该在MediaScannerConnectionClient接口的实现中执行onMediaScannerConnected方法中的所有操作。您已经为onScanCompleted实现了此接口,因此您只需将逻辑放在那里而不是轮询MediaScannerService以查看它是否已连接。

答案 1 :(得分:1)

我也试过Jeff的代码。它似乎只适用于旧画廊而不是新画廊3D。

Gallery3D目前在logcat中返回:

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

并浏览CacheService的源代码,我发现了这个:

    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);
    }

由于我收到了“错误查找专辑”错误而不是“找不到专辑ID的专辑”,这意味着android正在查找专辑,但在这些专线的某处遇到了IOException。这是一个Android源问题吗?

答案 2 :(得分:1)

呀。这是CacheService.loadMediaSets中的源问题。

来源是:

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.");
    }
}

缺少从相册元数据中读取(hasImages和hasVideos)。放两行

 dis.getBoolean(); 
   dis.getBoolean(); 
mediaSet.mName = Utils.readUTF(dis);之后的循环中

将解决问题,但没有人会这样做。

因此,显然,由于源代码中的错误,无法在Gallery中显示指定的存储区(目录)。 :(

答案 3 :(得分:0)

我无法获取文件夹工作的缩略图视图。相反,我通过在文件夹中的第一个图像上启动图库来管理几乎同样好的东西。

以下是我想要完成的内容的描述。用户从列表视图中选择特定记录。此记录可以包含一些与之关联的图像。我希望能够使用Nexus One上的酷炫Gallery3D应用程序浏览这些图像(现在使用多点触控缩放功能!)。如果该记录的图像尚未缓存在设备的SD卡上,我会将它们下载为zip文件。然后我将该文件解压缩到SD卡上该记录的缓存目录。之后,我想启动画廊,只显示缓存目录中的图像。

执行下载并将zip文件解压缩到SD卡不是问题。但是,为了使图库工作,我不得不将MediaScannerConnection与MediaScannerConnectionClient一起使用。在让扫描仪连接之后(这有点好看),我遍历了调用scanner.scanFile的缓存目录中的所有文件。

MediaScannerConnectionClient#onScanCompleted会将生成的uri附加到ArrayList成员变量。当整个过程完成后,我将启动画廊,通过该列表中的第一个uri。这将查看目录中的第一个图像。我会更喜欢缩略图视图,但这已经足够了。

我对这个解决方案并不完全满意。似乎MediaScannerConnection异步工作,所以我的AsyncTask进行轮询/睡眠以查看它是否已完成扫描。

有没有其他人在第一次通话时没有连接MediaScannerConnection?为了解决这个问题,我正在做类似的事情:

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!");
}

丑陋我知道,但我不确定为什么第一次连接时遇到麻烦。 : - /

更新: 感谢jeffamaphone,我能够转储那些丑陋的代码。现在OnItemClickListener只调用scanner.connect()。传递给扫描程序构造函数的客户端初始化DownloadAsyncTask,它会在解压缩文件时调用ProgressDialog并调用scanner.scanFiles(...);