admin管理员组文章数量:1122847
如何下载apk文件?这里介绍两种方式:一通过异步任务读取文件,二利用系统方法DownloadManager进行下载。
通过异步任务下载apk 文件
public String downloadAsApk(String fileName) {
String filePath = FileUtil.getAvailableCacheDir() + "/gameApk/" + fileName + ".apk";
BufferedInputStream bis = null;
FileOutputStream fos = null;
try {
bis = new BufferedInputStream(urlcon.getInputStream());
int fileLength = urlcon.getContentLength();
File file = new File(filePath);
if (file.exists()) {
return filePath;
} else {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
}
fos = new FileOutputStream(file);
byte data[] = new byte[4 * 1024];
int count = 0;
long total = 0;
while ((count = bis.read(data)) != -1) {
total+=count;
if (fileLength > 0)
publishProgress((int) (total * 100 / fileLength)); //传递进度(注意顺序)
fos.write(data, 0, count);
fos.flush();
}
fos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return filePath;
}
如何调用呢?这里我使用了rxjava的方式。
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
FileDownload fileDownload = new FileDownload(gameBean.getGameDownPath());
String filePath = fileDownload.downloadAsApk(fileName);
subscriber.onNext(filePath);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String filePath) {
Log.d("lixx", "filePath = " + filePath);
Toast.makeText(getActivity(), "下载完成", Toast.LENGTH_SHORT).show();
install(filePath);
}
});
如果需要显示下载进度的dialog请自行设计和显示哦。
利用系统方法DownloadManager进行下载
从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作。Download Manager处理HTTP连接并监控连接中的状态变化以及系统重启来确保每一个下载任务顺利完成。
在大多数涉及到下载的情况中使用Download Manager都是不错的选择,特别是当用户切换不同的应用以后下载需要在后台继续进行,以及当下载任务顺利完成非常重要的情况(DownloadManager对于断点续传功能支持很好)。
分享一篇写的不错的文章哦。
Android中使用DownloadManager类来管理数据下载的教程
private void downloadApk(String downUrl, String fileName, String filePath) {
//取得系统的下载服务
DownloadManager downloadManager = (DownloadManager) getActivity()
.getSystemService(Context.DOWNLOAD_SERVICE);
//创建下载请求对象
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl));
request.setTitle(fileName);
request.setDescription("正在下载...");
request.setMimeType("application/vnd.android.package-archive");
request.allowScanningByMediaScanner();// 设置可以被扫描到;在默认的情况下,通过Download
// Manager下载的文件是不能被Media Scanner扫描到的
request.setVisibleInDownloadsUi(true);// 设置下载可见
request.setAllowedOverRoaming(false);//可以用来阻止手机在漫游状态下下载
request.setDestinationUri(Uri.fromFile(new File(filePath)));
request.setNotificationVisibility(DownloadManager.Request.NETWORK_MOBILE
| DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request
.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
downloadManager.enqueue(request);
}
是不是很简单,以后再也不用写异步任务喽。
监听DownloadManager的下载完成事件
新建广播接收类:
class DownLoadBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
downloadSub.onCompleted();
}
}
注册广播监听:
mDownloadReceiver = new DownLoadBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
getActivity().registerReceiver(mDownloadReceiver, intentFilter);
别忘在onDestroy() 中关掉广播监听哦。
安装apk
private void install(String filePath) {
File file = new File(filePath);
if (file != null) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
getActivity().startActivity(intent);
}
}
注意:最后的最后要强调一点,注意设置权限!!!!!
版权声明:本文标题:Android——下载apk文件,并在通知栏显示下载进度 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1729172266a1461678.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论