Android 如何处理DownloadManager的不同结果

Android 如何处理DownloadManager的不同结果,android,kotlin,broadcastreceiver,android-download-manager,Android,Kotlin,Broadcastreceiver,Android Download Manager,我需要做的是: 使用DownloadManager通过URL下载文件,并分别处理成功下载和错误下载。 我尝试的是: 我使用BroadcastReceiver捕捉文件下载的结果。我尝试使用DownloadManager.ACTION\u DOWNLOAD\u COMPLETE作为标记,但它不仅在成功下载文件时触发,而且在发生错误且未下载文件时也会触发。 因此,似乎DownloadManager.ACTION\u DOWNLOAD\u只完成了尝试下载的报告,无论结果如何。 有没有办法只捕获成功的下载

我需要做的是: 使用DownloadManager通过URL下载文件,并分别处理成功下载和错误下载。 我尝试的是: 我使用BroadcastReceiver捕捉文件下载的结果。我尝试使用DownloadManager.ACTION\u DOWNLOAD\u COMPLETE作为标记,但它不仅在成功下载文件时触发,而且在发生错误且未下载文件时也会触发。 因此,似乎DownloadManager.ACTION\u DOWNLOAD\u只完成了尝试下载的报告,无论结果如何。 有没有办法只捕获成功的下载? 我的代码: fragment.kt

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
downloadCompleteReceiver = object : BroadcastReceiver(){
            override fun onReceive(context: Context?, intent: Intent?) {
            Snackbar.make(requireActivity().findViewById(android.R.id.content), getString(R.string.alert_files_successfully_downloaded), Snackbar.LENGTH_LONG).show()
            }
        }
        val filter = IntentFilter()
        filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
        requireActivity().registerReceiver(downloadCompleteReceiver, filter)
}
请求:

fun downloadMediaFiles(listOfUrls: List<MediaDto>, activity: Activity, authToken:String) {
        if (isPermissionStorageProvided(activity)) {
            val manager = activity.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
            listOfUrls.forEach {
                val request = DownloadManager.Request(Uri.parse(it.url))
                request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
                request.setTitle(activity.getString(R.string.download_manager_title))
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
                request.setDestinationInExternalPublicDir(
                    getDestinationDirectoryFromFileExtension(it.url),
                    "${System.currentTimeMillis()}"
                )
                request.addRequestHeader("authorization", authToken)
                manager.enqueue(request)
            }
        }
    }
然后将此引用ID作为参数传递给getDownloadStatus。
getDownloadStatus成功时返回整数8,失败时返回整数16,我可以进一步处理。

此函数将返回下载状态。有关值,请参见。如果找不到给定id的下载,则返回-1

int getDownloadStatus(long id) {
    try {
         DownloadManager.Query query = new DownloadManager.Query();
         query.setFilterById(id);
         DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
         Cursor cursor = downloadManager.query(query);
         if (cursor.getCount() == 0) return -1;
         cursor.moveToFirst();
         return cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
    } catch(Exception ex) { return -1; }    
 }
int getDownloadStatus(long id) {
    try {
         DownloadManager.Query query = new DownloadManager.Query();
         query.setFilterById(id);
         DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
         Cursor cursor = downloadManager.query(query);
         if (cursor.getCount() == 0) return -1;
         cursor.moveToFirst();
         return cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
    } catch(Exception ex) { return -1; }    
 }