2012-09-19 58 views
7

DownloadManager看起來是一個在片狀移動互聯網連接上有大量後臺下載的應用程序的正確選擇。Android DownloadManager:下載失敗,但COLUMN_REASON只返回「佔位符」

使用網絡上找到的教程代碼,應用程序能夠從系統的DM請求下載像這樣:

// in onCreate() 
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); 

// in requestData() 
Uri u = Uri.parse("http://server:8000/feed/data"); 
Request dreq = new Request(u); 
dreq.setNotificationVisibility(Request.VISIBILITY_HIDDEN); 
downloadID = dm.enqueue(dreq); 

在該代碼的URL是本地計算機上的測試服務器。該URL的作品,Android模擬器中的瀏覽器可以檢索該頁面,並且當我的應用通過DownloadManager和上面引用的代碼請求該頁面時,服務器返回HTTP代碼200。

這是ACTION_DOWNLOAD_COMPLETE BroadcastReceiver中的相關代碼,它在DM檢索文件時被調用。

Query q = new Query(); 
q.setFilterById(downloadID); 
Log.i("handleData()", "Handling data"); 
Cursor c = dm.query(q); 
if (c.moveToFirst()) { 
    Log.i("handleData()", "Download ID: " + downloadID + "/" + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_ID))); 
    Log.i("handleData()", "Download Status: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS))); 
    if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) { 
    String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
    Log.i("handleData()", "Download URI: " + uriString); 
    } else if (c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) { 
    Log.i("handleData()", "Reason: " + c.getString(c.getColumnIndex(DownloadManager.COLUMN_REASON))); 
    } 
} 

奇怪的結果是這樣的:

的DOWNLOAD_STATUS是16(或STATUS_FAILED),但其原因是 「佔位符」。

這是爲什麼?爲什麼服務器返回200狀態碼時會失敗?爲什麼DownloadManager沒有提供任何理由?

回答

14

在這裏回答我自己。

下面是問題:COLUMN_REASON不是一個字符串,而是一個數字值。

Log.i("handleData()", "Reason: " + c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON))); 

將返回一個可以使用的實際錯誤代碼。

+0

我可以看到什麼原因意味着什麼 – Nick

+1

在[DownloadManager API文檔](http://developer.android.com/reference/android/app/DownloadManager.html)中列出了幾個可能的值 - 查找「 COLUMN_REASON的值「。 – hez

相關問題