异步任务下载apk文件并弹出对话框提示当前进度,文件下载结束后弹出安装界面
生活随笔
收集整理的這篇文章主要介紹了
异步任务下载apk文件并弹出对话框提示当前进度,文件下载结束后弹出安装界面
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
主要任務
1.下載apk保存到sd卡指定目錄
2.下載時顯示下載的進度
3.下載完成后彈出對話框提示安裝
分析過程:
下面是完整代碼:
先創建異步任務執行下載操作
package com.android.download;import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.os.AsyncTask; import android.os.Environment;/*** 下載apk任務* 泛型一:String:表示下載的URL* 泛型二:Integer:每次讀取進度條的返回值,用于界面更新* 泛型三:String:表示返回值類型,返回被下載的apk文件 的路徑,為啟動apk安裝做準備* */ public class MyTask extends AsyncTask<String, Integer, String> {public interface CallBack {public void start(); //任務開始這里面應該彈出進度條對話框public void updataProgress(int progress);//獲取到更新的進度值為進度條對話框設置值/*** 下載完成,* * 1.對話框消失* * 2.啟動安裝apk界面,需要apk路徑*/public void finish(String apkPath);}CallBack cb;public MyTask(CallBack cb) {super();this.cb = cb;}@Overrideprotected void onPreExecute() {super.onPreExecute();if (cb != null) {cb.start();}}@Overrideprotected String doInBackground(String... params) {// 1.HttpURLConnectionHttpURLConnection conn = null;String apkPath = null;// 2.URLtry {URL url = new URL(params[0]);// 3.url.openConnectionconn = (HttpURLConnection) url.openConnection();// 4.InputStreamInputStream in = conn.getInputStream();// 獲取該文件的總長度int total = conn.getContentLength();// 5.獲取保存文件的路徑及文件 名/sdcard/abcdefg/tmp.apkString path_sdcard = Environment.getExternalStorageDirectory().getAbsolutePath() + "/abcdefg";File fileParent = new File(path_sdcard);// 判斷該目錄是否存在,如果不存在,創建該目錄if (!fileParent.exists()) {// 創建目錄fileParent.mkdirs();}// 6.創建File對象,再拿到OutputStreamFile file = new File(path_sdcard, "tmp.apk");//用來返回該apk路徑apkPath = file.getAbsolutePath();OutputStream out = new FileOutputStream(file);// 7.創建byte[] bufferbyte[] buffer = new byte[4096];// 8.inputStream==>OutputStream// 循環讀寫時,應該要把每次讀入的長度進行累加,再把累加的值與總長度除一下,得到百分比用于更新進度條的值int sum = 0;int len = 0;while ((len = in.read(buffer)) != -1) {out.write(buffer, 0, len);// 累加sum = sum + len;// 計算百分比int per = (int) (sum * 100f / total);// 發布進度值publishProgress(per);}out.flush();// 收尾out.close();in.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}// 返回當前被保存的apk的絕對路徑return apkPath;}@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);if (cb != null) {cb.updataProgress(values[0]);}}/** result表示的是apk的路徑*/@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);if (cb != null) {cb.finish(result);}}}
package com.android.download;import java.io.File;import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View;import com.android.download.MyTask.CallBack;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}ProgressDialog pd;// 點擊下載apkpublic void downlaod(View view) {// 1.啟動下載任務MyTask task = new MyTask(new CallBack() {@Overridepublic void updataProgress(int progress) {pd.setProgress(progress);}@Overridepublic void start() {pd = new ProgressDialog(MainActivity.this);pd.setTitle("下載提示");pd.setMessage("正在下載apk...");pd.setCancelable(false); //設置下載過程對話框不能消失pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.show();}@Overridepublic void finish(String apkPath) {// 消失對話框pd.dismiss();// 啟動安裝installApk(apkPath);}});task.execute("apkPath");//需要下載的apk鏈接}/*** 安裝apk* * @param url*/private void installApk(String apkFilePath) {File apkfile = new File(apkFilePath);if (!apkfile.exists()) {return;}Intent i = new Intent(Intent.ACTION_VIEW);i.setDataAndType(Uri.parse("file://" + apkfile.toString()),"application/vnd.android.package-archive");startActivity(i);} }
xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.day012_downloadapk.MainActivity" ><Buttonandroid:onClick="downlaod"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="下載apk" /></RelativeLayout>不要忘了添加聯網權限和讀寫sd卡權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/>界面效果圖:
最后讀者可以自己加個判斷文件是否已經存在 如果已經存在啟動安裝即可
總結
以上是生活随笔為你收集整理的异步任务下载apk文件并弹出对话框提示当前进度,文件下载结束后弹出安装界面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓开发之路-浅识Android
- 下一篇: SharedPreferences记住用