2017-05-25 92 views
1

我剛開始幫助一個已建立的android項目,並且對如何將系統轉換爲做我想做的事情感到不知所措。請記住,我對android還是很新的,所以如果這個問題的一部分沒有意義,我會道歉,或者我說錯了。在Uri旁邊創建新文件

該項目使用ContentResolver遍歷usb OTG棒或內部存儲的DCIM文件夾。我得到的是每個找到的視頻文件的Uri。我需要打開並獲取該文件的原始文件描述符編號,然後在其旁邊創建一個新文件以進行寫入(使用像originalvideo.mp4.trim.mp4這樣的名稱,不必非常漂亮),然後獲取原始文件描述符編號也是如此。

該項目對這些文件進行ffmpeg調用,併爲了避免使用OTG棒出現權限錯誤(因爲Google更新了OTG權限的限制),我們只能使用從Java獲取的文件描述符。這是脖子上的王室痛苦,但經過數週的摸索,這是我們發現做這項工作的唯一方式,所以我們堅持這一點。

這是目前發生了什麼內部的遍歷循環:

final Uri documentUri = DocumentsContract.buildDocumentUriUsingTree(rootUri, docId); 
ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(documentUri, "r"); 

if (fd != null) { 
    int ret = NativeLib.testFd(fd.getFd()); 
} 

的路徑名我從烏里得到這個樣子:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4和我在一個不知如何做,並打開一個新的文件旁邊像這樣的一個:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4.trim.mp4。我已經嘗試將Uri轉換爲文件,我在創建文件之前嘗試了編輯路徑,但都拋出IOExceptions,說No such file or directory。不,我正在努力創造它。

這是我來得到它的工作最接近:

File f = new File(documentUri.getPath() + ".trim.mp4"); 

if(!f.exists()) 
    f.createNewFile(); 

ParcelFileDescriptor fn = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_WRITE_ONLY); 

但即使這樣,拋出IOExcept。

謝謝你提供的任何幫助。

回答

3

的路徑名我從烏里這個樣子:/tree/primary:DCIM/document/primary:DCIM/V0480060.MP4

一個Uri不是一個文件。如果Uri的方案碰巧是file,然後Uri的路徑將是文件系統路徑。否則,它是一個不透明的字符串。

我在一個不知如何做,並打開一個新的文件旁邊一個像這樣的

rootUri是指向文檔樹一個Uri。因此,考慮到:

第1步:總結在一個DocumentFilevia fromTreeUri()

第2步:建立在同一棵樹上的另一個文檔,using createFile()

第3步:使用Uri你從createFile()以與您使用的相同的方式獲得documentUri

現在,請記住,您沒有嚴格控制文件名。很可能處理USB OTG將使用您傳入createFile()作爲文件名的「顯示名稱」。這不是要求。存儲訪問框架(DocumentsContract等)背後的要點是擺脫文件和文件名的思考。

+0

非常感謝您的幫助。我能夠使用'Uri newkid = DocumentsContract.createDocument(contentResolver,childrenUri,「video/mp4」,oldname +「trim.mp4」);'在老版本的旁邊創建一個新的孩子。 – DweebsUnited