下载管理器进度在通知区域不可见

Download Manager Progress Not Visible in the Notification Area

我正在使用下载管理器从 url 下载文件。并且文件下载成功。

问题

文件正在静默下载,通知区域没有通知。

下载管理器在我的 运行 android 6.0 设备上显示通知(带进度条)。在我将我的设备更新到 android 7.0 后,下载管理器不会在通知区域显示任何通知

这是我的代码

Uri uri = Uri.parse("file://" + destination);

url = "http:....."; //Valid File URL

//Set up download manager request

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Downloading " + file_name);
request.setTitle("My Downloader");
request.setDestinationUri(uri); //URI is valid

//Start the download
DownloadManager manager = (DownloadManager) getContext()
                                .getSystemService(Context.DOWNLOAD_SERVICE);

另外添加 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); 对我的情况没有帮助。

构建信息

这是我的 Gradle 构建信息。

minSdkVersion 22
targetSdkVersion 23
compileSdkVersion 25
buildToolsVersion "25.0.2"

为什么首先会发生这种情况?

问题的原因是 Android 下载管理器的通知在设置中被禁用。 (这是我的 Galaxy S7 的新默认值 - SM930W8,它随新 Android N (7.0) 更新一起提供)

解决方案1

  1. 转到“设置”>“应用程序”
  2. 在选项中单击“显示系统应用程序
  3. 找到“下载管理器”并打开它
  4. 点击“应用程序设置”下的“通知
  5. 开启允许通知

完成上述步骤后,上面一段用于下载通知的代码工作正常。

解决方案 2

上述解决方案不适用于应用程序的一般分发。我们不能告诉用户执行解决方案 1。

在 activity 中添加您自己的小进度条以显示下载百分比将使用户知道请求的文件 he/she 正在下载。

尽量避免通知,因为如果 android 下载管理器发出相同的通知,那么它是多余的。 (关于它们所在的 ROM,显示通知的默认设置可能因设备而异)

所以这是代码。

Uri uri = Uri.parse("file://" + destination);

url = "http:....."; //Valid File URL

//Set up download manager request

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setDescription("Downloading " + file_name);
request.setTitle("My Downloader");
request.setDestinationUri(uri); //URI is valid

//Start the download
DownloadManager manager = (DownloadManager) getContext()
                                .getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(request);

final int UPDATE_PROGRESS = 5020;

final Handler handler = new Handler(){
    @Override
        public void handleMessage(Message msg) {
        if(msg.what==UPDATE_PROGRESS){
            String downloaded = String.format("%.2f MB", (double)((msg.arg1)/1024)/1024);
            String total = String.format("%.2f MB", (double) (msg.arg2)/1024)/1024);
            String status = downloaded + " / " + total;
            pDialog.setTitleText(status);
        }
        super.handleMessage(msg);
        }
    };
    new Thread(new Runnable() {
        @Override
        public void run() {
            boolean downloading = true;
            while (downloading) {
                DownloadManager.Query q = new DownloadManager.Query();
                q.setFilterById(downloadId);
                Cursor cursor = manager.query(q);
                cursor.moveToFirst();
                int bytes_downloaded = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                int bytes_total = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
                    downloading = false;
                }
                //Post message to UI Thread
                Message msg = handler.obtainMessage();
                msg.what = UPDATE_PROGRESS;
                //msg.obj = statusMessage(cursor);
                msg.arg1 = bytes_downloaded;
                msg.arg2 = bytes_total;
                handler.sendMessage(msg);
                cursor.close();
            }
      }
}).start();

解决方案 3

如@kunal 所述,添加 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 也有帮助。

试试这个

DownloadPdf = (Button) findViewById(R.id.downloadpdf);
DownloadPdf.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

       File file = new File (Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOWNLOADS)+"/Pdf/" + "/" + name + ".pdf");
        if (file.exists()) {
            Toast.makeText(CatalogDetailActivity.this, "File Sudah ada", Toast.LENGTH_SHORT).show();
        } else {

      Download_Uri = Uri.parse(testing);
        DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
        request.setAllowedOverRoaming(false);
        request.setTitle("Downloading");
        request.allowScanningByMediaScanner();
        request.setDescription("Downloading");

        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "/Pdf/" + "/" + name + ".pdf");
        refid = downloadManager.enqueue(request);
       }
    }
});

我遇到了类似的问题,文件下载成功,但在通知区域看不到进度。

问题与通知可见性有关。以下行帮助我解决了它:

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

希望对您有所帮助。