4

我正在開發一款安卓相機應用程序,我們在多種情況下使用了uris。將結果數據從我們的相機傳回給啓動我們獲取結果的應用程序,或者當用戶單擊分享按鈕時打開IntentChooser。內容Uri vs. File Uri:未來有什麼用?

現在我們使用的檔案URI在大多數情況下,因爲它似乎是更安全的解決方案。與ContentResolver和MediaStore一起工作總是會出現問題。此外,我記得前段時間有很多應用程序,它們不支持Content Uris,但File Uris非常好。

但是,我們現在通過Google發送郵件通知,如果用戶決定在Android 6.0上不提供「環聊」文件訪問權限,則使用File Uris提供的功能不允許他們的「環聊」應用訪問該文件。

我現在的問題是:將內容傳送到其它應用程序時,我們是否應該從一般檔案URI切換到內容尤里斯?這是否應該走,並且每個應用程序都應該依賴/支持Content Uris?

+2

https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html – CommonsWare

+0

@CommonsWare非常好,謝謝! – mAx

回答

3

是,內容的URL是要走的路。

在相機應用的情況下,我不知道該文件的URL是有史以來非常明智的 - 已通過一個文件來調用應用程序,你怎麼知道你什麼時候可以刪除該文件?通過內容網址,調用應用程序可以通過網址請求數據,並且當您提交數據時,您可以釋放您的資源副本。 (如果應用程序希望對通過內容url訪問的數據進行「永久性」訪問,則由它自行保存該數據)。

+0

所以有一些協議,那個內容uris是非常臨時的,文件uris不是?否則,我應該如何知道我的內容Uri的收件人何時使用它? – mAx

+0

所有的URL都是臨時的 - 如果你想保證你從一個url獲得相同的數據,那麼你緩存這些數據,而不是多次請求它。對於文件網址,因爲他們只是指向最終使用它們的文件,而不通知您(作爲提供者)他們已經使用了它們,所以您沒有很好的觸發器,以至於何時可以刪除底層文件文件(並且通常用戶是懶惰的,並且認爲該文件是數據的足夠好的兌現副本)。 – zmarties

+0

好吧......聽起來好像提供商可以確定他提供給其他應用的內容使用時間。你能給我一個提示怎麼做嗎?謝謝你的努力! – mAx

0

您應該使用內容URI來與Android 7.0交換applications.Starting之間的文件,你會得到傳遞文件URI您的應用程序之外FileUriExposedException。 這裏是behaviour changes starting android 7.0

對於應用定位的Android 7.0的摘錄,Android框架強制執行禁止暴露文件StrictMode API政策://的URI您的應用程序之外。如果包含文件URI的意圖離開您的應用程序,則該應用程序將因FileUriExposedException異常而失敗。

要共享文件的應用程序之間,就發送一個內容:// URI和授予對URI的臨時訪問權限。