15

DownloadManager 클래스를 사용하여 프로그래밍 방식으로 파일을 다운로드하고 있습니다. 모두 정상적으로 작동하지만 다운로드 완료 알림을 유지할 수 없습니다. 다운로드가 완료되면 즉시 사라집니다. 내 코드는 다음과 같습니다.진저 브레드 기기에서 "다운로드 완료"알림이 사라지는 이유는 무엇입니까?

Request rqtRequest = new Request(Uri.parse(((URI) vewView.getTag()).toString())); 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
((DownloadManager) getSystemService(DOWNLOAD_SERVICE)).enqueue(rqtRequest); 

웹 관련 질문이 있지만 솔루션을 찾을 수 없습니다.

답변

16

DownloadManager은 진저 브레드에 대한 완료 알림을 지원하지 않습니다. 당신은 직접 그것을 보여야합니다.

BroadcastReceiver to detect when the download finishes를 사용하여 자신의 통지를 보여

public class DownloadBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
      //Show a notification 
     } 
    } 
} 

및 매니페스트에 등록 :

<receiver android:name="com.zolmo.twentymm.receivers.DownloadBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> 
    </intent-filter> 
</receiver> 

또한, setNotificationVisibility는 API 레벨 11 (허니 콤)하지 ICS에서 추가되었다.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
0

글쎄, 어떤 버전을 테스트하고 있습니까? VISIBILITY_VISIBLE_NOTIFY_COMPLETED를 설정하면 다운로드 완료시에만 표시되도록 알림을 설정해야합니다. 다운로드 중에 알림이 표시되면 ICS 이전 플랫폼에서 실행 중이라고 가정해야합니다. 나는 응용 프로그램을 디버깅합니다. 중단 점을 설정하여 실행중인 "if"선택 항목을 확인하십시오.

+0

ICS 및 최신 장치에서 다운로드 중에 알림이 표시되고 다운로드 후에도 계속 표시됩니다. Gingerbread 및 이전 장치에서는 다운로드 할 때 표시되지만 완료되면 사라집니다. 이에 대한 개발자 문서는 없습니다. 나는'if' 문을 제거하고 Gingebread 에뮬레이터에서 이것을 실행하려고했기 때문에 중단 점을 넣을 필요성을 보지 못했습니다. 다운로드가 완료되면 코드가 실행되고 알림이 나타납니다. –

0

거친 (그러나 간단한) 방법 일 수도 있습니다. 다운로드가 완료된 후 새로운 알림을 작성하는 것이 더 좋을 수도 있습니다. PS : 아, 미안하지만 실제로 "왜"라는 질문에 대한 답변이 아니지만 여전히 도움이 될 수 있습니다.

2

을 당신은 당신의 자신을 만들 필요가 다음 ICS 상수의 사용이 의도적인지,하지만 당신은뿐만 아니라 벌집의 사용에 다음과 같은 시스템 통지에 코드를 변경 할 수 있는지 확실하지 않습니다 진저 브레드에 대한 완전한 알림을 다운로드하십시오.

첫째, DownloadManager에서 다운로드에 대한 참조를 얻을 :

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
DownloadManager.Request request = new Request(someUri); 
//... 
long downloadReference = downloadManager.enqueue(request); 

그런 다음 사용자 정의 BroacastReceiver의 에디터를 이용해 완전 한 방송을 수신 :

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
     long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
     if (downloadReference == reference) { 
       // Send your own notification 
     } 
    } 
}; 

registerReceiver(receiver, filter); 

하고 자신의 다운로드 완료 통지를 보내기 .

+0

이 접근법에 대한주의 사항은 BroadcastReceiver가 활동주기에 연결된다는 것입니다. 알림을 높이려면 [등록 된 수신자] (http://stackoverflow.com/a/13824306/80425)를 사용하는 것이 좋습니다. –

+0

@DavidCaunt. 좋은 지적, 답안에서 다룹니다. 나는 그것을 +1했습니다. –

관련 문제