GitHub項目地址:Share2
看過上壹篇文章的同學應該知道,調用Android系統內置的分享功能主要有三個步驟:
更多相關內容請參考上壹篇文章,在此不再贅述。
了解了大致的實現流程後,其實只要解決以下幾個問題就可以實現了。
其實這直接決定了最終的實現形式。我們知道,在常見的使用場景中,它只是在應用程序之間共享圖片和壹些文件。對於那些只共享文本的產品,兩者在實現上要考慮的問題是完全不同的。
因此,為了解決這個問題,我們可以預先設置支持的共享內容類型,我們可以對不同的類型進行不同的處理。
在Share2中,壹個* * *定義了五類共享內容,基本可以覆蓋常見的使用場景。在調用共享接口時,可以直接指定內容類型,如文本、圖片、音視頻等文件類型。
不同類別的內容可能有不同的來源。例如,文本可能只是壹個字符串對象,為了共享圖片或其他文件,我們需要壹個Uri來標識資源。實際上,這就導致了具體實現中的壹個大問題,如何獲取要共享的文件的Uri,而這個Uri必須由接收共享內容的應用程序來處理。
那麽,如何獲得要共享的內容文件的Uri呢?如果處理可以讓接收方根據Uri得到文件呢?
我們將文件URIs的來源分為以下三種類型:
常見場景:通過文件選擇器獲取文件的Uri。
這樣得到的Uri由系統ContentProvider返回,Android 4.4之前的版本和後來的版本差別很大。如何處理,後面再說。先記住這個系統返回的Uri就行了。
比如調用系統攝像頭拍照或者錄制音視頻,傳入壹個Uri生成目標文件,從7.0開始就需要使用FileProvider。
如果使用FileProvider,我們要註意它和系統ContentProvider返回的Uri之間的區別。例如,我們為清單中的FileProvider配置了Android:authorities = " com . xx . XXX . file provider "的屬性。那麽系統返回的Uri的格式就變成了:content://com . xx . XXX . file provider...對於這種類型的Uri,我們姑且稱之為用戶自定義的fileprovider返回的Uri,然後再來講如何處理。
當我們調用新文件時,我們需要傳入指定的文件路徑。這個絕對路徑通常是:/storage/emulated/0/...這種風格,如果我們想調用共享,我們需要將文件路徑更改為文件Uri。那麽,我們如何將文件路徑更改為文件Uri呢?下面也回答了這個問題。
如上所述,文件URIs有三種類型,不同類型的處理方法也不同。否則,妳會遇到的第壹個問題是:
這是由於對系統返回的Uri沒有訪問權限造成的,所以需要授權應用程序臨時訪問Uri,否則會提示權限缺失。
對於共享系統返回的Uri,我們可以這樣處理:
請註意,即使設置了臨時訪問權限,自定義FileProvider返回的Uri在與第三方應用程序共享時也不會被識別。
壹個典型的場景是,如果我們將自定義FileProvider返回的Uri設置分享給微信或QQ等第三方應用,會提示文件不存在,因為他們無法識別Uri。
這個問題的處理其實和把文件路徑改成系統返回的Uri是壹樣的。我們只需要將自定義FileProvider返回的Uri更改為第三方應用程序可以識別的Uri。
在創建FileProvider時,需要傳入壹個File對象,這樣就可以直接知道文件路徑,這就把問題變成了:如何通過文件路徑獲取系統返回的Uri。
下面是根據傳入的文件對象和類型查詢系統ContentProvider得到對應的Uri,在不同的系統版本中已經根據不同的文件類型進行了適配。
其中forceGetFileUri方法是通過反射實現的,處理特殊情況下7.0以上系統的兼容性,壹般不會調用。Android 7.0開始不允許file:// Uri在不同app之間共享文件。但是,如果FileProvider方法仍然無效,我們可以通過反射取消檢測。
通過將文件路徑轉換為Uri,我們最終統壹了調用系統共享時傳入內容Uri的三種不同場景,最終全部轉換為交付系統返回的URIs,使得第三方應用可以正常獲取共享內容。
Share2按照上述方法實現,可以通過以下方式集成:
分享圖片到指定界面,比如分享到微信朋友圈。
GitHub項目地址:Share2