为 Android Q (API 29) 及更高版本使用 DownloadManager 和 Content Provider 的正确方法?

问题描述

我的代码的问题是,它正在下载文件,并且在图库中显示的路径如下 => "/storage/emulated/0/Download/filename.jpg"

但是当我点击完成的下载通知时,它会打开一个带有 URI =>“content://com.android.providers.downloads.documents/document/7123”的文件

它是 0kb。

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

       //Setting title of request
       request.setTitle(fileName);
       request.setAllowedOverRoaming(true);
       request.allowScanningByMediaScanner();
       String mimeType =
               
 MimeTypeMap.getSingleton().getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(url));
       request.setAllowedOverMetered(true);

       if (!Utils.checkNullOrblank(mimeType))
           request.setMimeType(mimeType);

         
       
 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
            {
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,fileName);
            }else
                request.setDestinationInExternalPublicDir(filepath,fileName);

            downloadId = downloadManager.enqueue(request);
        } catch (Exception e) {
            e.printstacktrace();
        }
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            ContentValues contentValues = new ContentValues();
           contentValues.put(MediaStore.Downloads.TITLE,fileName);
           contentValues.put(MediaStore.Downloads.disPLAY_NAME,fileName);
           contentValues.put(MediaStore.Downloads.MIME_TYPE,mimeType);

           contentValues.put(MediaStore.Downloads.RELATIVE_PATH,Environment.DIRECTORY_DOWNLOADS);

           // Insert into the database
            ContentResolver database = context.getContentResolver();
            uri.setValue(database.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI,contentValues));
      }

我做错了什么?如何以正确的方式执行此过程?

解决方法

1.使用 ContentValues,您只在数据库(内部)中注册,但不会插入下载的对象本身。配置内容值后,使用位图压缩来保存对象本身。 uri = database.insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI,contentValues)),uri = 你的文件uri 2.只用 contentValues.put(MediaStore.DownloadColumns.IS_PENDING,1) contentValues.put(MediaStore.Downloads.TITLE,fileName);没有 contentValues.put(MediaStore.DownloadColumns.DISPLAY_NAME,fileName)。 (使用位图压缩保存后) contentValues.clear() contentValues.put(MediaStore.DownloadColumns.IS_PENDING,0) contentValues.put(MediaStore.Downloads.DISPLAY_NAME,fileName + ".ext");然后 uri.update(insert,values,null,null)