【问题标题】:Android downloading file through DownloadManager not working correctlyAndroid 通过 DownloadManager 下载文件无法正常工作
【发布时间】:2013-03-08 10:39:15
【问题描述】:

我正在尝试通过 DownloadManager 下载文件,它在大多数手机(Nexus 系列、S3 等)上都可以正常运行,但在 Galaxy S2 上由于某种原因可以下载,但文件名设置错误并且当我尝试打开它时(无论是从通知中,还是下载应用程序),它都说无法打开该文件,即使是 jpeg、gif、png 等文件也是如此。

代码如下:

DownloadManager downloadManager = (DownloadManager) service
                .getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request downloadReq = new DownloadManager.Request(
                Uri.parse(URL));
        downloadReq
                .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI
                        | DownloadManager.Request.NETWORK_MOBILE);
        downloadReq.allowScanningByMediaScanner();
        downloadReq.setMimeType(attachment.mimeType);
        downloadReq.setTitle(attachment.fileName);
        downloadReq.setDescription("attachment");
        downloadReq.setDestinationInExternalFilesDir(service,
                Environment.DIRECTORY_DOWNLOADS, "");
        downloadReq
                .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE
                        | DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        downloadIDs.add(downloadManager.enqueue(downloadReq));

另外请注意所有网址都是https,手机的android版本是4.1.2 有什么想法吗?

非常感谢!

更新:如果我在此调用中添加文件名:

downloadReq.setDestinationInExternalFilesDir(service,
                Environment.DIRECTORY_DOWNLOADS, attachment.fileName);

好名字显示在通知中心。

【问题讨论】:

    标签: android download download-manager


    【解决方案1】:

    您应该注册自己以在文件下载完成后接收广播。在那里你也可以获取文件名。这将需要对代码进行一些更改:

    保留入队调用返回的 ID:

    long enqueue = downloadManager.enqueue(downloadReq);
    

    注册接收器以获取广播:

    getApplicationContext().registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    

    声明接收者:

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (!DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                return;
            }
            context.getApplicationContext().unregisterReceiver(receiver);
            Query query = new Query();
            query.setFilterById(enqueue);
            Cursor c = dm.query(query);
            if (c.moveToFirst()) {
                int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
                if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
    
                    String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                    Log.i(TAG, "downloaded file " + uriString);                    
                } else {
                    Log.i(TAG, "download failed " + c.getInt(columnIndex));                    
                }
            }
        }
    };
    

    假设下载的文件名不是好的做法。如果您再次下载它而不删除之前的一个,它将自动获得一个后缀。

    【讨论】:

    • 您好,感谢您的回答。我已经有一个 BroadcastReceiver,问题是没有添加 mime 类型,即使我添加了这个:downloadReq.​​setMimeType(attachment.mimeType);
    • 我检查了我的应用程序中的代码,但没有提供 mime。下载的文件是 .apk 并且工作正常,到目前为止没有报告任何问题。唯一的区别是我还为下载指定了一个文件名,而您使用“”。
    • 好的,我也尝试在这个方法调用中传递文件名:downloadReq.​​setDestinationInExternalFilesDir(service, Environment.DIRECTORY_DOWNLOADS, "");确实在通知中心我看到了文件名,而不是“-some_value”,但打开仍然无法正常工作,它只是显示一个吐司说“无法打开文件”,即使它是一个 .png 文件,我我试图弄清楚 S2 与我测试过的其他手机有什么不同......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多