2010-12-07 61 views
4

我試圖用Intent打開File,但Android並未打開正確的文件類型應用程序。右mimeType用於打開文件

使用下面的代碼,每一個文件 - PDF,圖片,一切 - 打開與音樂應用程序:

Intent i = new Intent(Intent.ACTION_VIEW); 
i.setData(Uri.fromFile(file)); 
startActivity(i); 

當我手動指定mime類型,正確的應用程序打開 - 在這種情況下,圖片查看器。

i.setDataAndType(Uri.fromFile(file), "image/*"); 

有什麼辦法讓Android打開正確的應用程序,而不是從文件的擴展名手動設置類型?

回答

1

這取決於其他應用程序。如果他們已經設置了他們的意圖過濾器,包括啞劇信息,文件擴展名信息或兩者。所以,我的建議是你不能依賴於其他應用程序,所以最好的選擇是在你啓動一個intent時提供儘可能多的信息,包括MIME類型。

+1

但是,爲什麼Android不能自行確定正確的類型?意圖引用聲明類型爲「指定意圖數據的顯式類型(MIME類型)」,通常該類型是從數據本身推斷的,通過設置此屬性,可以禁用該評估並強制顯式類型。這對我的代碼完全不起作用,所以它必須是錯誤的? – Gubbel 2010-12-08 15:24:01

1

你可以做這樣的事情:

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setData(Uri.fromFile(file)); 
intent.setType(FileHelper.getMimeType(file)); 
startActivity(intent); 

這裏是(相關部分)我的助手類從文件獲得mime類型。

的關鍵是使用MimeTypeMap

public class FileHelper 
{ 

    public static String getMimeType(File file) 
    { 
     return getMimeType(file.getName()); 
    } 

    public static String getMimeType(String fileName) 
    { 
     String extension = getExtension(fileName); 
     if (extension == null) 
      return null; 
     return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    } 

    public static String getExtension(File file) 
    { 
     return getExtension(file.getName()); 
    } 

    public static String getExtension(String fileName) 
    { 
     int extensionDelimiter = fileName.lastIndexOf("."); 
     if (extensionDelimiter == -1) 
      return null; 
     return fileName.substring(extensionDelimiter + 1, fileName.length()); 
    } 
} 

希望這有助於。

+0

完美地工作。謝謝。 我想知道爲什麼版主無權將回復標記爲答案? MSDN Q/A網站有這個不錯的功能。 – Sufian 2014-02-12 07:05:29