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을 반환합니다.
DM이 파일을 검색 할 때 호출되는 ACTION_DOWNLOAD_COMPLETE BroadcastReceiver의 관련 코드입니다.
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가 이유를 제시하지 않는 이유는 무엇입니까?
무엇이 어떤 의미인지 알 수 있습니다. – Nick
[DownloadManager API doc] (http://developer.android.com/reference/android/app/DownloadManager.html)에 여러 가지 가능한 값이 나와 있습니다. - " 해당 페이지에서 'COLUMN_REASON 값'을 선택하십시오. – hez