5

使用Google相冊應用,我試圖挑選未在設備上緩存的視頻。從Google相冊應用獲取視頻(非本地)

我正在使用ACTION_GET_CONTENT意圖啓動選項對話框,然後從中選擇Google相冊應用。

選擇本地視頻時,它會以此形式返回Uri。

內容://媒體/外部/視頻/媒體/ 6708

,並從我查詢內容提供商檢索實際文件的位置,並從那裏繼續。文件位置如下所示。在視頻不可用:

/存儲/模擬/ 0/WhatsApp的/媒體/ WhatsApp的 視頻/ VID-20131102-WA0000.mp4

現在,當我選擇一個在線視頻,即我的設備還沒有,並且需要下載使用,返回的烏里看起來是這樣的:

內容://com.google.android.apps.photos.content/1/ https://lh6.googleusercontent.com/_RD-QTO_SK5jlaPldTe2n5GANqMc3h-ukcbNoFlF1NLy=s0-d

現在,有了這個,沒有記錄的ContentProvider可以幫助我獲得到這個視頻的實際鏈接。即使我做了查詢,它也不會返回除DISPLAY_NAME和SIZE列之外的任何內容。

DISPLAY_NAME包含video.mpeg(對於不同的視頻相同的顯示名稱)

SIZE可能告訴我的實際文件的大小。

Referred to this post on SO.

我檢查各個崗位,並認爲我會得到通過內容提供商的視頻的InputStream,保存文件,並用文件的工作。然而,選擇一個圖像文件效果不錯,但是對於視頻而言,它不會。

因此,要將流複製到文件,我有這個代碼。

 
InputStream inputStream = context.getContentResolver().openInputStream(Uri.parse(path)); 

最後寫入臨時文件。該文件被創建,但似乎沒有正確格式化。 VLC播放該文件,但始終只顯示第一幀。

如果我從上面給出的URI的最後部分獲取URL並嘗試在瀏覽器上查看它,它會下載一個GIF文件。我猜這就是問題所在。但我不知道如何獲得視頻的格式。

任何人都經歷過相同的?

回答

5

終於找到了解決問題的辦法。這將適用於圖像和視頻。

參考以下視頻:

的DevBytes:Android 4.4系統的存儲訪問架構:客戶端

https://www.youtube.com/watch?v=UFj9AEz0DHQ

 
Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setType("image/*"); 
startActivity(intent); 

得到URI,並獲得和保存這樣的文件:

 
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver() 
       .openFileDescriptor(Uri.parse(path),"r"); 

FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 

InputStream inputStream = new FileInputStream(fileDescriptor); 

BufferedInputStream reader = new BufferedInputStream(inputStream); 

// Create an output stream to a file that you want to save to 
BufferedOutputStream outStream = new BufferedOutputStream(
        new FileOutputStream(filePath)); 
byte[] buf = new byte[2048]; 
int len; 
while ((len = reader.read(buf)) > 0) { 
    outStream.write(buf, 0, len); 
} 

出於某種原因,不使用ParcelFileDescriptor獲取輸入流不起作用。

+0

非常感謝你的這一點,這已經幫了很多! 這是一個相關的問題和接受的答案: http://stackoverflow.com/q/30572261/3309883 –