首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android cooliris图库开发人员文档

Android cooliris图库开发人员文档
EN

Stack Overflow用户
提问于 2010-02-11 01:06:42
回答 4查看 4.7K关注 0票数 2

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

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

代码语言:javascript
复制
// 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);

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2010-02-11 04:43:23

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

代码语言:javascript
复制
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类查询)。

您现在正在做的是传递该存储桶中的第一个图像,而gallery会自动显示视图中的其他图像,但不同的是,您尝试查看的是图像,而不是存储桶,这就是它不会显示在缩略图视图中的原因。

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

票数 1
EN

Stack Overflow用户

发布于 2010-04-19 06:00:10

我也尝试了Jeff的代码。它似乎只在旧的画廊中起作用,而在新的gallery3D中不起作用。

Gallery3D当前在日志目录中返回以下内容:

代码语言:javascript
复制
E/CacheService(  503): Error finding album -280923911

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

代码语言:javascript
复制
    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的相册”错误,这意味着安卓正在查找相册,但在这些行中的某个地方遇到了IOException。那么这是android源代码的问题吗?

票数 1
EN

Stack Overflow用户

发布于 2011-11-12 04:29:39

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

来源是:

代码语言:javascript
复制
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)。放置两行代码

代码语言:javascript
复制
 dis.getBoolean(); 
   dis.getBoolean(); 

mediaSet.mName = Utils.readUTF(dis);之后的循环中将解决问题,但没有人会这样做。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2238760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档