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,這個類來完成一些長時間進行的工作:

</pre><pre name="code" class="java">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();
}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章