2012-06-17 27 views
20

我已經在這裏回顧了所有類似的問題,但我不能爲我的生活弄清楚我做錯了什麼。啓動文件和MIME類型的意圖?

我寫了一個應用程序,試圖啓動各種文件,排序文件瀏覽器。 單擊某個文件時,它會嘗試根據其關聯的MIME類型啓動該程序,或者顯示「選擇要啓動的應用程序」對話框。

下面是我使用啓動代碼:

File file = new File(app.mediaPath() + "/" +_mediaFiles.get(position)); 

    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); 

    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); 
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); 
    myIntent.setDataAndType(Uri.fromFile(file),mimetype); 
    startActivity(myIntent); 

這種失敗並生成錯誤:如果我安裝例如OI文件管理器

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///file:/mnt/sdcard/roms/nes/Baseball_simulator.nes } 

現在,它打開的這個代替錯誤被拋出,然後如果從內部單擊相同的文件,它將啓動相應的對話框。

我注意到該特定文件的MIME類型失敗,但其他MIME類型如.zip確實返回值。

我是否錯過了當MIME類型爲空時調用允許用戶選擇的對話框?

我試過啓動應用程序的其他變體,包括不設置MIME類型,只使用.setData沒有成功。

我想要發生的操作是,用戶單擊文件,如果它與應用程序啓動的應用程序相關聯,如果不是,則用戶通過應用程序列表獲得「完成操作使用」對話框。

感謝您的任何建議。

+0

什麼是mimetype字符串?將它粘貼到這裏 –

+0

看起來像是有某個關聯文件是正確的MIME類型,但是如果它沒有綁定到應用程序,它通過null .. – stonedonkey

回答

44

好得益於開放意圖的傢伙,我錯過了答案通過他們自己的文件管理器代碼的第一次,這是我結束了:

File file = new File(filePath); 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(file.getName()); 
    String type = map.getMimeTypeFromExtension(ext); 

    if (type == null) 
     type = "*/*"; 

    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri data = Uri.fromFile(file); 

    intent.setDataAndType(data, type); 

    startActivity(intent); 

如果您使用的"*/*"當MIME類型您無法從系統中確定它(它是null)它會觸發相應的選擇應用程序對話框。

+7

警告! - 對於jpg,MIME類型是jpeg而不是jpg。使用你的代碼,如果你提取JPG擴展名,它不會正確設置MIME類型,因此你將無法查看圖像。設置jpg圖像的MIME類型時,請務必用jpeg替換jpg。 – AndroidDev

+0

感謝它幫助我,但設置intent.setDataAndType(數據,類型)後實際文件不選擇器;文件上傳失敗。 –

+1

此外,MimeTypeMap.getFileExtensionFromUrl無法很好地處理撇號:它將爲「World'sHello.docx」返回一個空字符串,但將返回「WorldzHello.docx」的docx。 請參閱這裏的正則表達式:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/webkit/MimeTypeMap.java – Felix

1

您可以使用通用的意圖來打開文件,這樣的建議here這個代碼片段:

private void openFile(File aFile){ 
    try { 
     Intent myIntent = new Intent(android.content.Intent.VIEW_ACTION, 
     new ContentURI("file://" + aFile.getAbsolutePath())); 
     startActivity(myIntent); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 
}  

但我通常看到的應用程序檢查嵌套如果最後嘗試打開文件,「文件的擴展名text/plain的「類型:

Intent generic = new Intent(); 
generic.setAction(android.content.Intent.ACTION_VIEW); 
generic.setDataAndType(Uri.fromFile(file), "text/plain");  
try { 
    startActivity(generic); 
    } catch(ActivityNotFoundException e) { 
    ... 
}  

你可以看到this question或本open source project完整的代碼。我希望這對你有所幫助。

+0

我試過這兩個,都沒有導致結果我在找。第一個示例生成相同的異常。 第二次嘗試只啓動了解text/plain作爲MIME類型的應用程序,因此也不起作用。 雖然謝謝。 – stonedonkey