借力使力不费力——文件下载篇

本文介绍了使用Nohttp、Xutils3及OkGo等库在安卓应用中实现文件下载的方法。涉及权限申请、进度显示及错误处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1。Nohttp下载(如果不清楚基本使用或不了解自己解决)

package com.example.administrator.myplayerdemo.activitys;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.download.DownloadListener;
import com.download.FileDownloader;
import com.example.administrator.myplayerdemo.AppConfig;
import com.example.administrator.myplayerdemo.R;
import com.example.administrator.myplayerdemo.fileutils.AppUtils;
import com.yanzhenjie.nohttp.Headers;
import com.yanzhenjie.nohttp.Logger;
import com.yanzhenjie.nohttp.NoHttp;
import com.yanzhenjie.nohttp.download.DownloadRequest;
import com.yanzhenjie.nohttp.error.NetworkError;
import com.yanzhenjie.nohttp.error.ServerError;
import com.yanzhenjie.nohttp.error.StorageReadWriteError;
import com.yanzhenjie.nohttp.error.StorageSpaceNotEnoughError;
import com.yanzhenjie.nohttp.error.TimeoutError;
import com.yanzhenjie.nohttp.error.URLError;
import com.yanzhenjie.nohttp.error.UnKnownHostError;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionNo;
import com.yanzhenjie.permission.PermissionYes;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;

import io.netopen.hotbitmapgg.library.view.RingProgressBar;

/**
* Created by Administrator on 2017/3/27 0027.
* 文件下载的demo
* 注意Nohttp下载必须在真机上测试
*/
public class FileDownappDemo extends Activity implements View.OnClickListener {
private Button btn;
//private ProgressBar pb;
private RingProgressBar pd;
// private TextView tv_result;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filedemo);
btn= (Button) findViewById(R.id.btn);
btn.setOnClickListener(this);
// pb= (ProgressBar) findViewById(R.id.pb_progress);
pd= (RingProgressBar) findViewById(R.id.progress_bar_2);
// tv_result= (TextView) findViewById(R.id.tv_result);
}

public void downapp(){
  checkVersion("http://api.nohttp.net/download/1.apk");
}
/**
 * 检查版本更新
 * @param app_upload_url
 */
private void checkVersion(String app_upload_url) {
    DownloadRequest downloadRequest = NoHttp.createDownloadRequest(
            app_upload_url, AppConfig.getInstance().APP_PATH_ROOT, "w.apk", true, true);
    NoHttp.getDownloadQueueInstance().add(0, downloadRequest, downloadListener);

} private final static String PROGRESS_KEY = “download_single_progress”;
/**
* 下载监听
*/
private com.yanzhenjie.nohttp.download.DownloadListener downloadListener = new com.yanzhenjie.nohttp.download.DownloadListener() {

    @Override
    public void onStart(int what, boolean isResume, long beforeLength, Headers headers, long allCount) {
        int progress = AppConfig.getInstance().getInt(PROGRESS_KEY, 0);
        if (allCount != 0) {
            progress = (int) (beforeLength * 100 / allCount);
           // pb.setProgress(progress);
            pd.setProgress(progress);
        }
        updateProgress(progress, 0);


    }

    @Override
    public void onDownloadError(int what, Exception exception) {
        Log.i("gsc",exception.getMessage());


    }

    @Override
    public void onProgress(int what, int progress, long fileCount, long speed) {
        updateProgress(progress, speed);
       pd.setProgress(progress);
        AppConfig.getInstance().putInt(PROGRESS_KEY, progress);
    }

    @Override
    public void onFinish(int what, String filePath) {
        Logger.d("Download finish, file path: " + filePath);

    }

    @Override
    public void onCancel(int what) {

    }

    private void updateProgress(int progress, long speed) {
        double newSpeed = speed / 1024D;
        DecimalFormat decimalFormat = new DecimalFormat("###0.00");
        String sProgress = getString(R.string.download_progress);
        sProgress = String.format(Locale.getDefault(), sProgress, progress, decimalFormat.format(newSpeed));
        //tv_result.setText(sProgress);
    }
};

@Override
public void onClick(View v) {
    // 先判断是否有权限。
    if(AndPermission.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // 有权限,直接do anything.
        downapp();
    } else {
        // 申请权限。
        AndPermission.with(this)
                .requestCode(100)
                .permission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .send();
    }


}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
    AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
    // TODO 申请权限成功。
    downapp();
}
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List<String> deniedPermissions) {
    // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
    if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
        // 第一种:用默认的提示语。
        //AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING).show();
        Toast.makeText(getApplicationContext(),"权限被拒绝....",Toast.LENGTH_LONG).show();
    }
}

}

2.Xutils 3下载

package com.example.administrator.myplayerdemo.activitys;
import android.Manifest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.example.administrator.myplayerdemo.R;
import com.example.administrator.myplayerdemo.fileutils.AppUtils;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionNo;
import com.yanzhenjie.permission.PermissionYes;
import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;
import java.io.File;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;

import io.netopen.hotbitmapgg.library.view.RingProgressBar;
import is.arontibo.library.ElasticDownloadView;

/**
* Created by Administrator on 2017/3/27 0027.
*/
public class FileDownappXutilsDemo extends Activity implements View.OnClickListener {
private Button btn;
private RingProgressBar pd;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.xuils3);
    btn= (Button) findViewById(R.id.btn);

    pd= (RingProgressBar) findViewById(R.id.progress_bar_2);
    btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
    // 先判断是否有权限。
    if(AndPermission.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        // 有权限,直接do anything.
        dapp();
    } else {
        // 申请权限。
        AndPermission.with(this)
                .requestCode(100)
                .permission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .send();
    }

}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
    AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
    // TODO 申请权限成功。
   dapp();
}
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List<String> deniedPermissions) {
    // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
    if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
        // 第一种:用默认的提示语。
        //AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING).show();
        Toast.makeText(getApplicationContext(),"权限被拒绝....",Toast.LENGTH_LONG).show();
    }
}
private void dapp() {
    RequestParams params = new RequestParams("http://api.nohttp.net/download/1.apk");
    params.setAutoRename(true);//断点下载
    params.setSaveFilePath(Environment.getExternalStorageDirectory()+"/demo.apk");
    x.http().get(params, new Callback.ProgressCallback<File>() {

        @Override
        public void onSuccess(File result) {
           ;  Log.i("xutils","onSuccess"+result.getAbsolutePath());
            //pd.dismiss();

            AppUtils.installapp(FileDownappXutilsDemo.this,result.getPath());

        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) {
            Log.i("xutils","onError");
        }
        @Override
        public void onCancelled(CancelledException cex) {
            Log.i("xutils","onCancelled");
        }
        @Override
        public void onFinished() {

// pd.dismiss();
// Log.i(“xutils”,”onFinished()”);
}
@Override
public void onWaiting() {
Log.i(“xutils”,”onWaiting()”);
}
@Override
public void onStarted() {

// pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// pd.setProgressNumberFormat(“%1d b/%2d b”);
// pd.setTitle(“正在下载中..”);
// pd.setMessage(“请等待…..”);
//
// pd.show();
pd.setProgress(0);

        }
        @Override
        public void onLoading(long total, long current, boolean isDownloading) {
            pd.setProgress((int) (current));

// ev.setMax((int)total);
pd.setMax((int)total);
DecimalFormat df2 = new DecimalFormat(“###.00”);//这样为保持2位
System.out.println(“当前大小=”+df2.format(current/1024/1024));
System.out.println(“总共大小=”+df2.format(total/1024/1024));
// float f1 = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
// b = new BigDecimal( (float) total);
// float v = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();

           // pd.setProgress((int)current);
        }
    });
}

}

3.OKGO下载

package com.example.administrator.myplayerdemo.activitys;
import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.example.administrator.myplayerdemo.R;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionNo;
import com.yanzhenjie.permission.PermissionYes;

import java.io.File;
import java.util.List;

import io.netopen.hotbitmapgg.library.view.RingProgressBar;
import okhttp3.Call;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by Administrator on 2017/3/29 0029.
*/
public class FileDownappOKGODemo extends Activity {
private ProgressBar rb;
private RingProgressBar b;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.okgo);
rb= (ProgressBar) findViewById(R.id.pb);
b= (RingProgressBar) findViewById(R.id.progress_bar_2);
}
public void downapp(View view){
// 先判断是否有权限。
if(AndPermission.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// 有权限,直接do anything.
downApp();
} else {
// 申请权限。
AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.send();
}

}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
    AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
    // TODO 申请权限成功。
    downApp();
}
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List<String> deniedPermissions) {
    // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
    if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
        // 第一种:用默认的提示语。
        //AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING).show();
        Toast.makeText(getApplicationContext(),"权限被拒绝....",Toast.LENGTH_LONG).show();
    }
}
private void downApp() {
    OkGo.get("http://api.nohttp.net/download/1.apk")//
            .tag(this)//
            .execute(new FileCallback() {  //文件下载时,可以指定下载的文件目录和文件名
                @Override
                public void onSuccess(File file, Call call, Response response) {
                    // file 即为文件数据,文件保存在指定目录
                    String absolutePath = file.getAbsolutePath();
                    Log.i("gsc","下载成功!"+absolutePath);
                }
                @Override
                public void downloadProgress(long currentSize, long totalSize, float progress, long networkSpeed) {
                    //这里回调下载进度(该回调在主线程,可以直接更新ui)
                 rb.setProgress((int) currentSize);

                    rb.setMax((int) totalSize);
                    b.setProgress((int) currentSize);

                    b.setMax((int) totalSize);
                }
            });
}

}

FileDownloader(star 超过3000的开源项目)地址:https://github.com/gsc1234567890woshishui/FileDownloader

package com.example.administrator.myplayerdemo.activitys;
import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.example.administrator.myplayerdemo.AppConfig;
import com.example.administrator.myplayerdemo.R;

import com.example.administrator.myplayerdemo.fileutils.AppUtils;
import com.liulishuo.filedownloader.BaseDownloadTask;
import com.liulishuo.filedownloader.FileDownloadListener;
import com.liulishuo.filedownloader.FileDownloader;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.FileCallback;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.PermissionNo;
import com.yanzhenjie.permission.PermissionYes;

import java.io.File;
import java.util.List;

import io.netopen.hotbitmapgg.library.view.RingProgressBar;
import okhttp3.Call;
import okhttp3.Response;

/**
* Created by Administrator on 2017/3/30 0030.
*/
public class FileDownDemo extends Activity implements View.OnClickListener {

private RingProgressBar b;
private Button but,btn_stop;
private BaseDownloadTask baseDownloadTask;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.filedemo);
    b= (RingProgressBar) findViewById(R.id.progress_bar_2);
    but= (Button) findViewById(R.id.btn);
    btn_stop= (Button) findViewById(R.id.btn_stop);
    btn_stop.setOnClickListener(this);
    but.setOnClickListener(this);
}
  @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    // 只需要调用这一句,第一个参数是当前Acitivity/Fragment,回调方法写在当前Activity/Framgent。
    AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
// 成功回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
    // TODO 申请权限成功。
    downApp();
}
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List<String> deniedPermissions) {
    // 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
    if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
        // 第一种:用默认的提示语。
        //AndPermission.defaultSettingDialog(this, REQUEST_CODE_SETTING).show();
        Toast.makeText(getApplicationContext(),"权限被拒绝....",Toast.LENGTH_LONG).show();
    }
}

private void downApp() {
   baseDownloadTask = FileDownloader.getImpl().create("http://api.nohttp.net/download/1.apk")
            .setPath(Environment.getExternalStorageDirectory() + "/app.apk", false).setForceReDownload(true)
            .setListener(new FileDownloadListener() {
                @Override
                protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) {
                }

                @Override
                protected void connected(BaseDownloadTask task, String etag, boolean isContinue, int soFarBytes, int totalBytes) {

                }

                @Override
                protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) {
                    b.setProgress(soFarBytes);
                    b.setMax(totalBytes);

                }

                @Override
                protected void blockComplete(BaseDownloadTask task) {
                }

                @Override
                protected void retry(final BaseDownloadTask task, final Throwable ex, final int retryingTimes, final int soFarBytes) {
                }

                @Override
                protected void completed(BaseDownloadTask task) {
                    Log.i("gsc", "下载完成=" + task.getPath());
                    AppUtils.installapp(FileDownDemo.this, task.getPath());
                }

                @Override
                protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) {
                }

                @Override
                protected void error(BaseDownloadTask task, Throwable e) {
                }

                @Override
                protected void warn(BaseDownloadTask task) {
                }
            });
    baseDownloadTask.start();

}

@Override
public void onClick(View v) {
    if (v.getId()==R.id.btn_stop){
        baseDownloadTask.pause();
    }
    if (v.getId()==R.id.btn){
        // 先判断是否有权限。
        if(AndPermission.hasPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // 有权限,直接do anything.
            downApp();
        } else {
            // 申请权限。
            AndPermission.with(this)
                    .requestCode(100)
                    .permission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    .send();
        }
    }

}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南一舟110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值