2010-02-10 43 views
2

有誰知道如何與新的Gallery3D應用程序(cooliris android畫廊)集成?我想啓動該應用程序,以便僅顯示特定文件夾的縮略圖。Android酷鳥畫廊開發人員文檔

例如,假設我的應用程序下載圖片來自我的服務器,並將它們存儲在SD卡的文件夾(/ SD卡/ MYAPP /圖像緩存/ 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); 

謝謝。

+0

我認爲有一種方法可以做到這一點讓我調查一下 – 2010-02-10 19:44:20

+0

您是否找到了解決方案 – 2013-03-11 14:11:31

回答

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

進一步信息:

確保您有正確的道路(檢查尾隨斜線等)。作爲測試,您可以檢查從您的方法中發出的存儲桶標識是否等於數據庫中的存儲桶標識(您可以使用MediaProvider類查詢該標識)。

你現在正在做的是將第一個圖像傳遞到該桶中,並且庫自動在視圖中顯示其他圖像,但區別在於你正在嘗試查看圖像而不是桶,這就是爲什麼它不會不會以縮略圖顯示。

就您的MediaScanner問題而言,connect()是一個異步調用,所以您應該在方法onMediaScannerConnected中執行MediaScannerConnectionClient接口的所有操作。您已經爲onScanCompleted實現了此接口,因此您只需將邏輯放在那裏,而不是輪詢MediaScannerService以查看它是否已連接。

+0

不幸的是,這並不適用於我,它顯示了一些隨機設置的圖片文件夾I對我的手機。誠然,我可能會錯誤地實現你的答案。 我設法找到一個足夠接近的解決方案,我會後對其他任何人的興趣。 – mefesto 2010-02-10 21:50:39

+0

見上面WRT我的編輯你足夠接近的解決方案,並繼續的問題。 – 2010-02-10 23:44:37

+0

好吧,我重新設計的東西,你所描述的方法。該onMediaScannerConnected方法開始這一過程的其餘部分,它的工作真的很好。非常感謝!我仍然無法得到bucketId事工作。在模擬器上,它看起來像它的工作但在我的手機上,它不斷打開一個不同的文件夾爲了確保我執行了一個查詢來獲取第一個圖像Uri的BUCKET_ID,並且仍然得到了錯誤的文件夾。哦,我可以沒有它。 – mefesto 2010-02-11 00:36:19

0

我無法獲得工作文件夾的縮略圖視圖。相反,我通過在文件夾中的第一個圖像上啓動畫廊來管理一些東西。

下面是我想要完成的描述。用戶從列表視圖中選擇特定的記錄。該記錄可以有幾張圖像與之相關聯。我希望能夠使用Nexus One上的酷炫的Gallery3D應用程序瀏覽這些圖像(現在使用多點觸控變焦!)。如果該記錄的圖像尚未緩存在設備的SD卡上,我會將其作爲zip文件下載。然後,我將該文件解壓縮到sdcard上的該記錄的緩存目錄。之後,我想要啓動畫廊並僅在該緩存目錄中顯示圖像。

執行下載和解壓壓縮文件到SD卡不是一個問題。但是,爲了讓畫廊工作,我必須將MediaScannerConnection與MediaScannerConnectionClient一起使用。在獲得掃描儀連接(這是一種flakey)之後,我繞過了緩存目錄中的所有文件,它們調用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!"); 
} 

醜我知道,但我不知道爲什麼它有連接第一時間的麻煩。 : -/

UPDATE: 感謝jeffamaphone,我能夠轉儲醜陋的代碼。現在OnItemClickListener只是調用scanner.connect()。傳遞給掃描器構造函數的客戶機初始化DownloadAsyncTask,它在解壓文件並調用scanner.scanFiles(...)時更新ProgressDialog;

1

我想傑夫的代碼。它似乎只適用於舊的畫廊,而不適用於新的畫廊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的源代碼問題嗎?

+0

您是否找到解決方案? ? – 2013-03-11 16:32:15

1

是的。這是CacheService.loadMediaSets中的源代碼問題。

的來源是:

從專輯元數據(hasImages和hasVideos)的
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."); 
    } 
} 

讀缺失。把兩條線

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

在循環mediaSet.mName = Utils.readUTF(dis);後就能解決問題,但沒有人會做。

所以,很顯然,因爲在源代碼中的bug是不可能的顯示在圖庫指定桶(目錄)。 :(

+0

對於DataInputStream類型,getBoolean()方法未定義。我該如何解決它?謝謝 – 2013-03-11 14:09:19