1

Android N에 다운로드 관리자 알림에 새로운 취소 버튼이 있습니다.Android N - 다운로드 관리자 알림 취소 버튼

사용자가이 버튼을 누르면 진행률 표시 줄을 멈추도록 일부 코드를 excecute하고 싶습니다. 어떤 메소드가 호출되면?

의도 필터 동작 DownloadManager.ACTION_NOTIFICATION_CLICKED는 사용자가 취소 버튼을 클릭 할 때가 아니라 알림 자체를 클릭하는 경우에만 트리거된다는 점에 유의하십시오.

if_downloadManager = new IntentFilter(); 
    if_downloadManager.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 
    if_downloadManager.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED); 

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

      if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
       .... 
      } 

      if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { 
       // This code is not executed when the user presses the Cancel Button in the Download Manager Notification 
      }  
     } 
    }; 

미리 감사드립니다.

+0

 // get the download id from DownloadManager#enqueue getContentResolver().registerContentObserver(Uri.parse("content://downloads/my_downloads"), true, new ContentObserver(null) { @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); if (uri.toString().matches(".*\\d+$")) { long changedId = Long.parseLong(uri.getLastPathSegment()); if (changedId == downloadId[0]) { Log.d(TAG, "onChange: " + uri.toString() + " " + changedId + " " + downloadId[0]); Cursor cursor = null; try { cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { Log.d(TAG, "onChange: running"); } else { Log.w(TAG, "onChange: cancel"); } } finally { if (cursor != null) { cursor.close(); } } } } } }); 

대답을 참조? 나는 같은 문제를 가지고있다. – Malko

답변

0

Malko, 해결책을 찾지 못했지만 다음 해결 방법을 사용하고 있습니다. 나는 안드로이드 핸들러 이하) 매 10 초 resetProgressIfNoOngoingDMRequest을 (실행하는 데 사용 :

public int numberOfOngoingDMRequest() { 
    cursor = downloadManager.query(new Query()); 
    int res = cursor.getCount(); 
    cursor.close(); 
    return res; 
} 

public boolean resetProgressIfNoOngoingDMRequest() { 
    if (numberOfOngoingDMRequest() == 0) { 
     refreshUpdateAllButton(false); 
     resetEpisodesDownloadIds(); 
     act.misc.notifyEpisodesDataSetChanged(); 
     return true; 
    } 
    return false; 
} 

너무 좋은 안하지만 일을한다. 앱이 포 그라운드에있는 경우에만이 작업을 수행합니다.

0

다른 해결책은 ContentObserver입니다.

다운로드 관리자 용 콘텐츠 URI는 content://downloads/my_downloads이어야하며이 데이터베이스의 변경 사항을 모니터링 할 수 있습니다. 다운로드 ID로 다운로드를 시작하면 행이 content://downloads/my_downloads/{downloadId}으로 생성됩니다. 이 작업이 취소되었는지 여부를 알기 위해이 커서를 확인할 수 있습니다. 반환 된 커서가 비어 있거나 null이고 데이터베이스에 레코드가 없으면이 다운로드 작업은 사용자에 의해 취소됩니다. 당신이 해결책을 찾았나요 here