有谁知道如何与新的Gallery3D应用程序集成(cooliris android图库)?我想启动该应用程序,以便它只显示特定文件夹的缩略图。
例如,假设我的应用程序从我的服务器下载图像,并将它们存储在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);谢谢。
发布于 2010-02-11 04:43:23
我被告知你需要像这样启动它:
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以查看它是否已连接。
发布于 2010-04-19 06:00:10
我也尝试了Jeff的代码。它似乎只在旧的画廊中起作用,而在新的gallery3D中不起作用。
Gallery3D当前在日志目录中返回以下内容:
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的相册”错误,这意味着安卓正在查找相册,但在这些行中的某个地方遇到了IOException。那么这是android源代码的问题吗?
发布于 2011-11-12 04:29:39
嗯。这是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中显示指定的存储桶(目录)。:(
https://stackoverflow.com/questions/2238760
复制相似问题