當前位置:名人名言大全網 - 笑話大全 - 利用Android系統的原生API實現共享功能(2)

利用Android系統的原生API實現共享功能(2)

在之前的文章中,我主要講了在使用Android系統原生API實現分享功能中的實現過程,但是在具體實現中還是有很多坑要面對的。那麽本文就是提供壹個打包的Share2庫供大家參考。

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