Android学习笔记19:带有通知栏的进度条的Android下载文件

1、首先,android的文件下载需要以下几个权限:

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

2、因为文件下载是一个长时间的任务,不能在UI线程中更新,需要另外开辟一个新的线程来进行下载的工作,在这里我们用Android封装的异步任务类——AsyncTask,这个类来完成一些长时间进行的工作:

private class DownloadAppTask extends AsyncTask<String, Integer, Boolean> {

private int RESULT_OK = 200;

private int PROGRESS_ID = 1;

private Context context;

private NotificationManager manager;

private NotificationCompat.Builder mBuilder;

private int size = 0;

private int max;

public DownloadAppTask (Context context){

this.context = context;

}

@Override

protected Boolean doInBackground(String... params) {

try {

return downloadUrl(params[0]);

} catch (IOException e) {

return false;

}

}

private boolean downloadUrl(String myurl) throws IOException {

InputStream is = null;

OutputStream os = null;

URL url = new URL(myurl);

HttpURLConnection conn = (HttpURLConnection)url.openConnection();

conn.setReadTimeout(10000);

conn.setConnectTimeout(15000);

conn.setRequestMethod("GET");

conn.setDoInput(true);

conn.connect();

int code = conn.getResponseCode();

url = null;

if(code==RESULT_OK) {

max = 0;

is = conn.getInputStream();

File file = new File(Environment.getExternalStorageDirectory(),"/app");

if(!file.exists()) {

file.mkdir();

}

final File f = new File(file.getAbsolutePath(),"myapp.apk");

os = new FileOutputStream(f);

byte[] buffer = new byte[1000];

max = conn.getContentLength();

new Thread(new Runnable() {

@Override

public void run() {

while (max>size) {

try {

publishProgress(size);

Thread.sleep(1000);

} catch (InterruptedException e) {

}

}

publishProgress(max);

installApp(f);

}

}).start();

int len;

while ((len = is.read(buffer))!=-1) {

os.write(buffer,0,len);

size = size + len;

}

os.flush();

os.close();

is.close();

conn = null;

file = null;

return true;

}

return false;

}

@Override

protected void onPreExecute() {

manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

mBuilder = new NotificationCompat.Builder(context);

mBuilder.setContentTitle("APP文件下载")

.setContentText("正在APP文件...")

.setSmallIcon(R.drawable.ic_launcher);

}

@Override

protected void onProgressUpdate(Integer... values) {

if(max<=values[0]) {

mBuilder.setContentText("APP文件下载完成!");

mBuilder.setProgress(0, 0, false);

}else {

mBuilder.setProgress(max, values[0], false);

}

manager.notify(PROGRESS_ID,mBuilder.build());

}

//文件下载完成安装应用

private void installApp(File file) {

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(Uri.fromFile(file),

"application/vnd.android.package-archive");

startActivity(intent);

}

}

3、在主线程中调用一下方法即可:

判断网络是否可用,然后执行进行下载

private void myClickHandler(){

ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = manager.getActiveNetworkInfo();

if(networkInfo!=null&&networkInfo.isConnected()) {

DownloadAppTask task = new DownloadAppTask(this);

task.execute("http://www.abc.2015/01/31/20150131140339351%E5%8D%83%E5%8D%92%E4%BF%9D%E8%BD%A6.apk");

}else {

Toast.makeText(this,"无可用的网络!",Toast.LENGTH_LONG).show();

}

}

时间: 2024-12-18 19:27:34

Android学习笔记19:带有通知栏的进度条的Android下载文件的相关文章

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记18:自定义Seekbar拖动条式样

Android 学习笔记之 个人认为最简单的查看Android源码方案

相信很多人都会疑惑如何使用Eclipse ADT查看源码? 下面我们将介绍 如何查看Android源码. 本文有如下优点: 1.不用费心去找Android源码地址:一个字烦,网上的东西杂七杂八的... 2.不用担心过程难,这个就三步.. 工具:ADT 第一步:找到你ADT根目录,打开SDK Manager.exe 第二步:勾选你想查看的source for android sdk,下载. 第三步:打开任意一个Android程序使用Ctrl+想要查看的代码,然后跳转到查看源码文件,点击Change

Android学习笔记&#183;从零开始【一】

开始着手Android.和大多数初用Eclipse的人一样,有些手忙脚乱. 之前看Cocos2d时零星的看过:Cocos2d后来也被耽搁下来了:关于Cocos2d点此穿越,日后更新笔记. 现做下Android学习笔记,记录点滴. -->点击进入Android学习笔记导图.         -->19本Android经典教程+104个Github上火爆项目开源源码 加油! ●1 绑定的SDK工具包http://developer.android.com/sdk ●2 Application Na

【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续探讨BaseAdapter 我们可以同继承抽象类BaseAdapter来实现自己的Adapter,自己设置子View的UI,不同子View可以由不同的布局,并自己进行数据和子view中数据的对应关系.图是例子的呈现结果,我们有很多图标,对这些图标按一定大小进行缩放,然后布局在GridView中.这个

Android学习笔记(九)——更复杂的进度对话框

显示操作进度的对话框 1.使用上一篇创建的同一项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_dialog3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick3" android:text=&qu

Android学习笔记_76_Android ProgressBar 进度条

android 进度条的样式  例1:(默认样式(中等圆形))Xml代码 <ProgressBar      android:id="@+id/progressBar1"     android:layout_width="wrap_content"      android:layout_height="wrap_content"      /> 例2:(超大圆形)Xml代码 <ProgressBar      android

Android学习笔记(24):进度条组件ProgressBar及其子类

ProgressBar作为进度条组件使用,它还派生了SeekBar(拖动条)和RatingBar(星级评分条). ProgressBar支持的XML属性: Attribute Name Related Method Description style 设置ProgressBar指定风格 android:indeterminate 设置为true时,进度条不显示运行进度 android:indeterminateBehavior indeterminate模式下.当进度条达到最大值时的动画处理行为

Android学习笔记:进度条ProgressBar和线程

ProgressBar是进度条,android中的指示器,先看效果图 上图中水平进度条可以看见有两种颜色,浅色的是SecondaryProgress,可以用作展示中间进度用. ProgressBar是有多种样式的,有水平的和圆圈打转的.若需要指示进度的可以使用水平的,其他样式在可以在android api文档找到 Other progress bar styles provided by the system include: Widget.ProgressBar.Horizontal Widg

【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csdn.net/flowingflying/ 应用有时需要从web中下载一个大文件,并保存在本地,这个操作过程是标准的,因此在Android2.3引入了DownloadManager类.相关的学习也可以参考Android学习笔记(四六):互联网通信-文件下载. 小例子 先看一个小例子,如下图所示.lay