2013-03-21 49 views
5

我正在使用DownloadManager從webService下載文件。下載成功結束,但是當我嘗試在「下載」文件夾中打開新文件時,出現了「無法打開文件」錯誤(我知道我可以打開此類文件)。Android DownloadManager「無法打開文件」

此外,當我將手機插入計算機並打開下載文件時,該文件將成功打開並且不會損壞。

我沒有其他錯誤,所以我真的迷路了!

這裏我的代碼:

/*Data*/ 
    int filePosition = position - _subFolderNameList.length; 
    String url = _folder.getFiles().get(filePosition).getUrl(); 
    String FileName = _folder.getFiles().get(filePosition).getName(); 
    String Description = _folder.getFiles().get(filePosition).getUrl(); 

    /*Prepare request*/ 
    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
    request.setDescription(Description); 
    request.setTitle(FileName); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     request.allowScanningByMediaScanner(); 
     request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
    } 
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, FileName); 

    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
    manager.enqueue(request); // Send request 

編輯:權限的清單:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+0

你下載的文件的類型?你如何試圖「打開」它?您只發布了下載代碼。 – FoamyGuy 2013-03-21 14:10:13

+0

我嘗試下載所有類型的擴展,但爲了測試,我只嘗試使用像PDF這樣的文件,因爲我知道我可以用手機打開它。 要打開它,我只需進入下載文件夾(用我的手機),然後點擊文件。 – Maugun 2013-03-21 14:15:48

+0

你確定你可以打開'.pdf'文件,手動下載*用你的手機(也許theres只是沒有安裝應用程序來處理VIEW Intent)?因爲我默認情況下無法使用我的設備打開許多文件類型... – tilpner 2013-03-21 15:11:13

回答

4

好吧,我發現這個問題!我不得不使用setMimeType()來指定文件的「MIME內容類型」。

public DownloadManager.Request setMimeType (String mimeType); 
+0

嗨,不知道你是否還在SOF附近,但如果你從鏈接下載文件,你不知道什麼文件擴展名是,那麼你怎麼知道要設置哪種MIME類型? – toantran 2013-10-29 14:33:27

2

是的,你必須指定MIME類型。 在接受的答案中增加更多的細節。

public DownloadManager.Request setMimeType (String mimeType); 

要獲得MIME類型,您可以使用以下函數。

private String getMimeFromFileName(String fileName) { 
    MimeTypeMap map = MimeTypeMap.getSingleton(); 
    String ext = MimeTypeMap.getFileExtensionFromUrl(fileName); 
    return map.getMimeTypeFromExtension(ext); 
} 

和以下是Xamarin.Android執行相同的:

 private static string GetMimeTypeFromFileName(string fileName) 
     { 
      var map = MimeTypeMap.Singleton; 
      var ext = MimeTypeMap.GetFileExtensionFromUrl(fileName); 
      return map.GetMimeTypeFromExtension(ext); 
     }