如果Internet断开连接并重新启动系统,下载管理器将无法继续下载

问题描述 投票:0回答:3

我已经创建了一个简单的应用程序,应该可以下载大型zip文件。经过一些研发,我得出的结论是我必须使用Download Manager来实现这一目标。 如果设备重新启动或互联网连接不稳定,我希望下载自动恢复。现在,该代码能够按预期下载大文件,但是如果Internet连接出现波动或系统重新启动,它将停止下载。

活动:

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

     };

    }

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

java android download-manager android-download-manager
3个回答
2
投票

引用文档,

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

我想是Download Manager,默认情况下会重试。

如果遇到问题,可以使用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
    }
}

没有亲自测试代码。但是应该可以。


1
投票

尝试获取下载失败的原因。例如,它是否可以在网络交换机wifi-> data

上运行

((如果您的错误原因是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/


0
投票

[我确认此问题在2020年仍然存在,当在模拟器中进行测试并启用WiFi时,始终出现此错误(即使在Android 10中也是如此。

在模拟器中关闭WiFi似乎可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.