2014-02-12 3 views
15

나는 앱 개발 중이고 현재 작업중인 기능 중 하나는 일부 바이너리 파일을 다운로드하는 것입니다. 그들 중 일부는 정말 큽니다 (몇 메가 바이트 이상). 파일 크기가 2GB 미만인 경우 다운로드가 정상적으로 완료됩니다.다운로드 관리자가 2.1GB 이상의 파일을 다운로드 중

진행률 업데이트 (진행률 업데이트 용 DownloadManager 풀링)가 3.2GB 인 파일에 고정되었지만 다운로드가 완료되면 대상 파일 경로에 파일이 없습니다. 해당 다운로드 ID에 대해 DownloadManager을 질문하면 STATUS_FAILED이 표시되고 이유는 ERROR_UNKNOWN입니다. 가장 좋아하는 오류 세부 정보가 있습니다.

이상한 점은 대부분의 장치에 표시되지만 일부 (예 : 삼성 SG 4 활성 OS 4.2.2 및 LG Nexus 5 OS 4.4.2)에는 나타나지 않습니다.

일부 추가 조사를 실시한 결과, 이것이 bug in Android DownloadManager implementation 인 것으로 나타났습니다. 안드로이드 구현은 int로 다운로드 카운트를 저장하지만, 그 숫자가 Integer.MAX_VALUE 이상이되면 다운로드가 실패로 끝납니다.

나는 전경 서비스와 DownloadManager 사용을 대체 할 생각입니다,하지만 난 아직 포기하지 않을 것입니다 .... 너희들이 직면 했 그렇다면, 당신이 그것을 어떻게 해결 되었습니까

? 4.2.2 이전 버전에서 DownloadManager을 사용할 수있는 임시 해결책이 있습니까? 파일 당 2.1GB 이상을 다운로드 할 수 있습니까?

+0

Koush에서 Ion을 확인하십시오. https://github.com/koush/ion 큰 파일로 잘 작동합니다. – josebama

+0

@josebama : UI에서 풀린 실제 다운로드입니까? 즉, 사용자가 기기를 회전하고 앱을 종료 한 다음 다시 들어가면 다운로드가 계속 진행되고 전체 UI와 일관성이 유지됩니까? – gunar

+0

나는 확인할 수 없다. 그러나 그것은 – josebama

답변

2

같은 대용량 파일을 다운로드하려면, 당신은 덩어리 사람들을 다운로드해야합니다. HTTP 범위 옵션을 지원하는 라이브러리를 사용하여 이력서 등을 지원하는 여러 파일에서 하나의 파일을 풀다운 할 수 있습니다.

또는 서버에서 큰 파일을 분할 한 다음 MD5 해시 각 파일, 처음 다운로드를 시작한 다음 MD5 파일을 얻은 다음 해시가 다운로드 한 파일과 일치하는지 확인하십시오. 그들이하지 않으면 그 조각을 삭제하고 다운로드 할 항목의 대기열에 추가하십시오.

모든 조각이 다운로드되고 MD5가 작동하면 조각을 다시 단일 파일로 넣을 수 있습니다.

SD 카드에서 파일을 다운로드하려는 경우 FAT32가 기본 파일 시스템입니다. 이 파일 시스템에는 파일 당 4GB 제한이 있습니다.

당신은 DownloadManager를 해결할 수 없습니다

+0

당신은 다른 사람들이 지금까지 말한 것을 요약했습니다. 그러나 나는 당신이 새로운 것을 제공했다고 생각하지 않습니다. – gunar

+0

이것은 당신이 그것을 통과 할 수있는 유일한 방법입니다, 나는 아직까지 다른 대답을 읽지 않았습니다. 나는 그걸 복사했다고 생각하지 않습니다. 가능한 한 간단히 그 글을 썼습니다. 왜 내가 당신에게 새로운 것을 제공하지 않았는 지 모르겠습니다. –

+0

그럴듯한 대답이 없기 때문에 실제로 대답하지 않더라도이 대답을 수락합니다. 결국에는 내 자신의 다운로드 관리자를 썼지 만,이 대답은 받아 들일 수있는만큼 가깝습니다. 처음에 나는'ksasq'의 대답을 받아들이고 싶었지만 chuncked content를 처리 할 수있는 서버가 없기 때문에 그것을 검증 할 수 없었습니다. 'Range' 솔루션은 서버가 지원하기 때문에 작동합니다. 감사! – gunar

0

파일을 작은 zip 파일로 분할하여이 문제를 해결할 수 있습니다. 다음 단계는 목표에 합류하는 것입니다. 도움이 될 ->this<-을 찾았습니다. 파일을 압축하지 않으면 (분할 옵션 만) 성능이 뛰어납니다. 다른 문제는 두 배의 저장 공간이 필요하다는 것입니다. 약 100MB 크기의 작은 파일을 다운로드하여 결합 된 버퍼에 쓰고 양식 파일 시스템을 제거하면 공간을 낭비하지 않게됩니다.

+0

응답 해 주셔서 감사합니다 (+1). 그러나 이것은 서버 측 옵션이 아닙니다. – gunar

4

Android 소스 코드를 보면 JB-MR2에서이 문제가 해결 된 것으로 보입니다.

이전 플랫폼 버전에서이 문제를 해결할 수있는 유일한 방법은 이러한 큰 리소스에 대해 청크 분할 전송 인코딩 [1]을 사용하도록 서버를 수정하는 것입니다. 이 경우 다운로드 관리자는 무시하고 Content-Length 헤더를 구문 분석하지 않습니다.

[1] http://en.wikipedia.org/wiki/Chunked_transfer_encoding

+0

답장을 보내 주셔서 감사합니다 (+1).하지만 불행히도 이것은 서버 측 옵션이 아닙니다.어쨌든, 누군가가이 접근법을 시도하고 그것이 작동하는지 확인하면 궁금합니다. – gunar

+0

이 답변은 지금까지 5 개의 upvotes 및 이것이 실제로 작동한다는 확인이 없습니다. 확인을 위해 청취 한 콘텐츠 응답을 지원하는 서버에 액세스 할 수 없습니다. – gunar

2

이 중 하나 개 명확한 결과가있다. 그 안에있는 버그라면 그렇게 될 것입니다. 따라서 간단히 말해서이 아니므로 DownloadManager을 사용하여이 문제를 해결할 수는 없습니다. 그러나 다른 해결책에 단어로 쓰여진 서버 측 접근법을 사용하면 해결할 수 있습니다.

@ksasq가이 문제가 해결되었다고 언급했기 때문에 가장 간단한 해결책은 JBoss MR2에 최소 sdk 레벨을 적용하는 것입니다.

그럴싸하거나 그렇지 않은 경우 가장 적합한 파일 다운로드 라이브러리를 찾아서이 라이브러리의 DownloadManager와 유사한 인터페이스를 만들 수 있습니다. 물론,이 버그가없는 버전의 경우 기본 DownloadManager를 사용하고이 버그가있는 사용자 및 가능한 경우 문제를 일으키는 파일에 대해 사용자 정의 라이브러리를 사용하도록이 인터페이스를 구현해야합니다.

불행하게도, 구글에서 검색이 마지막으로 또 다른 unfortunate note about this topic by CommonsWare 단순히 구글의 지원 라이브러리에는 DownloadManager이 없음을 확인 2012 년

업데이트 yingyixu's android-download-manager을 보였다. 더 나쁜 것은 그 사람이 너무 복잡하기 때문에 그 사람이 자신의 항구를 구현하는 아이디어를 포기했다는 것입니다. yingyixu의 라이브러리 나 다른 라이브러리를 사용하면 충분히 만족 스러울 것입니다.

+0

다운로드는 앱 기능 중 하나 일뿐입니다. 나머지 시장 점유율을 잃어 버리기 때문에 JB-MR2에 최저 수준을 설정할 수 없습니다. – gunar

0

DownloadManager의 고정 버전을 사용하여 패키지를 패키지 구조로 변경하고 시스템 버전 대신이 버전을 사용할 수도 있습니다. 결국 원래 패키지 android.app에서 일부 클래스를 가져와야합니다. 그런 다음 구현을 서비스로 등록하십시오.

+0

DownloadManager는 실제 다운로드를하지 않습니다. 시스템 응용 프로그램이 호출자 응용 프로그램을 대신하여 작업을 수행합니다. 이를 테스트하려면 샘플 앱에서 다운로드를 시작하고 앱을 강제 종료하십시오. 다운로드 관리자 앱을 열면 다운로드가 진행 중입니다. – gunar

관련 문제