通过DownloadManager下载Android文件无法正常工作

3
我正在尝试通过DownloadManager下载文件,大多数手机上都可以正常工作(Nexus系列、S3等),但在Galaxy S2上,由于某种原因,虽然下载成功,但文件名设置错误,当我尝试从通知或下载应用程序中打开它时(即使是像jpeg、gif、png等文件),它都会显示无法打开该文件。

enter image description here

以下是代码:

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,并且手机的安卓版本为4.1.2。有什么想法吗?
非常感谢!
更新:如果我在此调用中添加文件名:
downloadReq.setDestinationInExternalFilesDir(service,
                Environment.DIRECTORY_DOWNLOADS, attachment.fileName);

好的名称将显示在通知中心中。

1个回答

0

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

保留从enqueue调用返回的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); - Ciprian
我在我的应用程序中检查了代码,没有提供MIME。下载的文件是.apk,并且运行良好,到目前为止没有报告任何问题。唯一的区别是我还指定了下载的文件名,而你使用了“”。 - azertiti
好的,我也尝试在这个方法调用中传递文件名:downloadReq.setDestinationInExternalFilesDir(service, Environment.DIRECTORY_DOWNLOADS, ""); 确实在通知中心中看到了文件名,而不是“- some_value”,但打开仍然不起作用,它只会显示一个弹出窗口,上面写着“无法打开文件”,即使它是一个.png文件,我正在努力找出S2与我测试过的其他手机有何不同... - Ciprian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接