2013-03-08 257 views
1

我试图通过DownloadManager下载文件,它可以在大多数手机(Nexus家族,S3等)上完美工作,但由于某些原因下载工作在Galaxy S2上,但该文件的名称设置错误,当我尝试打开它(无论是从通知,无论是下载应用程序)它说,该文件无法打开,即使像JPEG,GIF,PNG等文件。Android下载文件通过DownloadManager无法正常工作

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); 

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

+0

这可能有助于http://www.gadgetsaint.com/android/download-manager/ – ASP 2017-05-23 13:16:36

回答

0

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

保留的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));      
      } 
     } 
    } 
}; 

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

+0

嗨,谢谢你的回答。我已经有一个BroadcastReceiver,问题是不知何故MIME类型不会被添加,即使我添加了这个:downloadReq.​​setMimeType(attachment.mimeType); – Ciprian 2013-03-08 11:27:10

+0

我检查了我的应用程序中的代码,没有提供哑剧。下载的文件是一个.apk文件,工作正常,目前没有报告任何问题。唯一的区别是我在使用“”时也为下载指定了一个文件名。 – azertiti 2013-03-08 12:09:25

+0

好吧,我也尝试在这个方法调用中传递文件名:downloadReq.​​setDestinationInExternalFilesDir(service,Environment.DIRECTORY_DOWNLOADS,“”);事实上,在通知中心里,我看到了文件名,而不是“ - some_value”,但开放仍然不起作用,它只是显示一个说“无法打开文件”的面包,即使它是一个.png文件, M试图找出S2中与我测试过的其他手机有什么不同... – Ciprian 2013-03-08 12:18:03

相关问题