android - 在 Android 下载管理器上获取总字节返回 -1

标签 android android-download-manager

我正在创建一个进度条以在 Android 下载管理器中显示百分比下载 apk 但 DownloadManager.COLUMN_TOTAL_SIZE_BYTES总是返回 -1下载完成后,它会返回文件大小。

String url = Config.GET_APK+ finalApk;
final DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.addRequestHeader("Authorization", token);

// in order for this if to run, you must use the android 3.2 to compile your app
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    request.allowScanningByMediaScanner();
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, finalApk);
Log.d("PATH1", String.valueOf(Environment.DIRECTORY_DOWNLOADS + "/" + finalApk));
// get download service and enqueue file
final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
final long downId = manager.enqueue(request);
Log.d("DOWNLOADID", String.valueOf(downId));

download.show();

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                boolean downloading = true;
                while (downloading) {
                    DownloadManager.Query q = new DownloadManager.Query();
                    q.setFilterById(downId);
                    Cursor c = manager.query(q);
                    c.moveToFirst();

                    int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
                    if (status == DownloadManager.STATUS_SUCCESSFUL) {
                        downloading = false;
                        download.dismiss();
                    }
                    final int bytes_download = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                    final int bytes_total = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                    Log.d("bytes_total", String.valueOf(bytes_total));
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            final double dl_prog = ((bytes_download * 100.0) / bytes_total);
                            download.setProgress((int) dl_prog);
                        }
                    });
                    c.close();
                }
            }
        }).start();
    }
},1000);

我已经在这个 using post delayed 中尝试过解决方案+ 在 download manager total size bytes doc它说它将返回-1在下载开始之前,它将返回下载大小。

最佳答案

在我的情况下,服务器没有发送文件的内容长度,我用一个简单的方法检查了它

URL url = new URL("URL");
url.openConnection().getContentLength();
即使在这里,内容长度也是-1。
在服务器端修复它后,DownloadManager 返回正确的 COLUMN_TOTAL_SIZE_BYTES

关于android - 在 Android 下载管理器上获取总字节返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46231236/

相关文章:

java - Android DownloadManager 获取文件名

java - 如何循环ArrayList并将每个值发送到下载管理器?

Android,在 GPS 上工作,但我不知道真实世界的坐标是如何工作的

android - 自定义数字时钟

用于加密/解密的 Java SimpleCrypto 类在 Coldfusion 9 和 Java (Android) 中产生不同的结果

Android 下载管理器 'Download Requires Network' 错误

用于测试 SQLite 架构更新的 Android ADB

android - 从GCM迁移到FCM后的PeriodicTask和OneoffTask

android - 安装 .apk 文件时出现解析错误

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