4

我目前正在學習開發Android應用程序,並有一個相當基本的問題:android如何找出隱式Intent的URI的MIME類型?

假設我想發出一個隱含的Intent來打開由URI鏈接指定的數據, 「內容://com.mynewauthority:8100 /表1」。假設我創建了一個自定義Content Provider,它在「content://com.mynewauthority:8100/table1」維護一個SQLite表。

現在,由於我沒有爲我的表指定MIME類型,但只有它的URI,Android必須能夠以某種方式找出它。但由於它是一個定製的表格,我自己決定MIME類型,所以我知道它可能是「猴子/香蕉」。我似乎無法在Content Provider實現中的任何位置找到指定哪個MIME類型與除了getType(URI uri)函數之外的哪些URI一起使用,而這些函數似乎未被Android系統用於Intent解析。

所以我的問題是:在隱式意圖的解析過程中,Android如何找出與定製內容提供者的URI相關聯的MIME類型?

希望這個問題已經夠清楚了!

+0

「這似乎沒有被Android系統用於Intent解析」 - 您的證據是,究竟是什麼? – CommonsWare

+0

對不起,我的壞!我沒有以正確的方式測試我的應用程序。現在我設法通過更改getType()函數來使應用程序中斷。所以基本上,Android系統使用getType(URI uri)函數進行意圖解析?這意味着Android系統可以查找與URI關聯的內容提供者並使用getType()函數來檢索MIME類型。 – user1365680

+0

不,它只需要根據權威機構('com.mynewauthority')確定的右側ContentProvider調用'getType()'。順便說一句,你不用'ContentProvider'使用端口號。 – CommonsWare

回答

0

如果你創建你的意圖反對自己,你可以通過使用強制連接到它的MIME類型:

fileType = "monkey/bananas"; 
intent.setDataAndType(fileUri, fileType); 

僅供參考,機器人通常從文件擴展檢測MIME類型,使用MimeTypeMap,我找不完整。您可以打印從MimeTypeMap class source code

+0

'MimeTypeMap'可以被'WebView'使用,但是我沒有看到任何其他證據被使用。 – CommonsWare

3

已知文件擴展名和相關MIME類型如果Intent中有一個MIME類型(見XGouchet的答案),那麼所使用。

如果Intent沒有在它的MIME類型,Android將嘗試確定MIME類型:

  • 對於ContentProvider,在你的情況下,對特定提供商爲Uri調用getType()根據權威
  • 對於http://Uri,它會發出一個HTTP請求HEAD
  • 對於大多數其他的東西,它失敗(例如,一個file://Uri