android下载主要分三步:
1.获取uri 2.采用异步类进行下载 3.将下载的apk保存到具体路径
apk安装
1.获取file路径,2.写一方法installApk启动装载
在这里,我给2中增加了进度条,以方便加载时的感官判断。
首先,我在xml里面添加按钮控件,将其onclick事件命名为download。然后进行进度条的声明。因为进度条在好几个方法里面都使用到,所以我们将它声明成全局变量。并且在onCreate方法中进行初始化设置。在download方法中进行异步类的和进度条的启动。
//声明进度条
ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pd=new ProgressDialog(this);
pd.setTitle("下载进度提示");
pd.setMessage("正在下载...");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setCancelable(false);
pd.setMax(100);
pd.setIndeterminate(false);
}
//开始下载apk
public void download(View view){
pd.show();
//启动AsyncTask
new MyTask().execute();
}
在异步类里面,我们对apk进行下载,保存。下载在doInBackground,进度条变动在onprogressUpdate,显示在onPostExecute。在这里,我们给InstallApk方法提供了apk的路径。
class MyTask extends AsyncTask<Void, Integer, Void>{
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
String http="http://www.ytmfdw.com/download/puzzle_v1.0.0.apk";
HttpURLConnection conn=null;
try {
URL url=new URL(http);
conn=(HttpURLConnection) url.openConnection();
//获取文件总大小
int totals=conn.getContentLength();
//获取文件输入流
InputStream in=conn.getInputStream();
//保存文件路径
String path=Environment.getExternalStorageDirectory().getAbsolutePath()+"/puzzle.apk";
File file=new File(path);
OutputStream out=new FileOutputStream(file);
//缓存数组大小
byte[]buffer=new byte[1024];
//当前读取多少字节
int count=0;
//声明一个总共读取了多少字节
int sumCount=0;
while((count=in.read(buffer))!=-1){
out.write(buffer,0,count);
//累加读取的字节数
sumCount+=count;
//计算出百分比
float per=sumCount*100f/totals;
//发布进度
publishProgress((int)per);
}
out.close();
in.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(conn!=null){
conn.disconnect();
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(pd!=null&& pd.isShowing()){
pd.dismiss();
}
//安装apk
String path=Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/puzzle.apk";
installApk(path);
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
pd.setProgress(values[0]);
}
安装apk的方法
/**
* 安装apk
* @param apkFilePath
*/
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);
}