在Internet断开连接和系统重启的情况下,下载管理器无法恢复下载

时间:2014-08-11 06:42:20

标签: java android download-manager android-download-manager

我创建了一个应该下载大型zip文件的简单应用程序。在一些R& D之后,我得出结论,我必须使用下载管理器来实现这一目标。 如果设备重新启动或者互联网连接不稳定,我希望自动恢复下载。现在,代码能够按预期下载大文件,但是在互联网连接波动或系统重启的情况下,它会停止下载。

活动:

public class MainActivity extends ActionBarActivity {

    String Download_path = "http://wickedbrains.com/map/mumbai.zip";
     String Download_ID = "DOWNLOAD_ID";

     SharedPreferences preferenceManager;
     DownloadManager downloadManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        preferenceManager = PreferenceManager.getDefaultSharedPreferences(this);
           downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);

           Button btnDownload = (Button)findViewById(R.id.download);
           btnDownload.setOnClickListener(new Button.OnClickListener(){

       @Override
       public void onClick(View arg0) {

        // Locate storage location
            String filepath = "";

            File folder = new File(
                    Environment.getExternalStorageDirectory() + "/osmdroid");
            boolean success = true;
            if (!folder.exists()) {
                success = folder.mkdir();
            }
            if (success) {
                // Do something on success
                filepath = Environment.getExternalStorageDirectory()
                        .getPath() + "/osmdroid";

                // Deleting if zip file exists
                File folder2 = Environment.getExternalStorageDirectory();
                String fileName = folder2.getPath() + "/osmdroid/mumbai.zip";

                File myFile = new File(fileName);
                if(myFile.exists())
                    myFile.delete();

            }


    //Starting download manager to download file
        Uri Download_Uri = Uri.parse(Download_path);
        DownloadManager.Request request = new DownloadManager.Request(Download_Uri);

        long download_id =  downloadManager.enqueue(request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |DownloadManager.Request.NETWORK_MOBILE)
                .setAllowedOverRoaming(false)
                .setTitle("Test")
                .setDescription("Map Download")
                .setDestinationInExternalPublicDir("/osmdroid","mumbai.zip"));

       // long download_id = downloadManager.enqueue(request);

        //Save the download id
        Editor PrefEdit = preferenceManager.edit();
        PrefEdit.putLong(Download_ID, download_id);
        PrefEdit.commit();
       }});
       }

     @Override
     protected void onResume() {
      // TODO Auto-generated method stub
      super.onResume();

      IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
      registerReceiver(downloadReceiver, intentFilter);
     }

     @Override
     protected void onPause() {
      // TODO Auto-generated method stub
      super.onPause();

      unregisterReceiver(downloadReceiver);
     }

     private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {

      @Override
      public void onReceive(Context arg0, Intent arg1) {
       // TODO Auto-generated method stub
       DownloadManager.Query query = new DownloadManager.Query();
       query.setFilterById(preferenceManager.getLong(Download_ID, 0));
       Cursor cursor = downloadManager.query(query);

       if(cursor.moveToFirst()){
        int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
        int status = cursor.getInt(columnIndex);
        int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);
        int reason = cursor.getInt(columnReason);

        if(status == DownloadManager.STATUS_SUCCESSFUL){
         //Retrieve the saved download id
         long downloadID = preferenceManager.getLong(Download_ID, 0);

         ParcelFileDescriptor file;
         try {
          file = downloadManager.openDownloadedFile(downloadID);
          Toast.makeText(MainActivity.this,
            "File Downloaded: " + file.toString(),
            Toast.LENGTH_LONG).show();
         } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          Toast.makeText(MainActivity.this,
            e.toString(),
            Toast.LENGTH_LONG).show();
         }

        }else if(status == DownloadManager.STATUS_FAILED){
         Toast.makeText(MainActivity.this,
           "FAILED!\n" + "reason of " + reason,
           Toast.LENGTH_LONG).show();
        }else if(status == DownloadManager.STATUS_PAUSED){
         Toast.makeText(MainActivity.this,
           "PAUSED!\n" + "reason of " + reason,
           Toast.LENGTH_LONG).show();
        }else if(status == DownloadManager.STATUS_PENDING){
         Toast.makeText(MainActivity.this,
           "PENDING!",
           Toast.LENGTH_LONG).show();
        }else if(status == DownloadManager.STATUS_RUNNING){
         Toast.makeText(MainActivity.this,
           "RUNNING!",
           Toast.LENGTH_LONG).show();
        }
       }
      }

     };

    }

我哪里错了?我该怎么做才能启用下载的恢复功能?

2 个答案:

答案 0 :(得分:1)

从文档引用,

  

下载管理器将在后台进行下载,负责HTTP交互并在发生故障或连接更改和系统重新启动后重试下载。

我猜下载管理器默认会重试。

如果您遇到问题,可以使用DownloadManager.Query课程并查询COLUMN_STATUSCOLUMN_REASON以获取下载状态

修改

开始下载

dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
Request request = new Request( YOUR_DOWNLOAD_URL );
long enqueue = dm.enqueue(request);

enqueue更像是下载请求ID。您可以使用该队列来获取下载进度/状态

查询下载状态

Query query = new Query();
query.setFilterById(enqueue);
Cursor c = dm.query(query);
if (c.moveToFirst()) {

    int downloadStatus = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));

    if (DownloadManager.STATUS_SUCCESSFUL == downloadStatus) {
        // download succeded
    } else if (DownloadManager.STATUS_FAILED == downloadStatus){
        String failedReason = c.getString(c.getColumnIndex(DownloadManager.COLUMN_REASON));
        // handle failures
    }
}

Haven自己测试了代码。但它应该有用。

答案 1 :(得分:0)

尝试了解下载失败的原因。 例如它是否适用于网络交换机wifi->数据

(如果你的错误原因是1008-这里似乎有一个报告错误

https://code.google.com/p/android/issues/detail?id=18462

进一步:

http://papaya-backend.net/2013/04/12/why-http-etag-header-may-cause-your-downloading-apps-on-android-failed/