android下载apk且安装

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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tiwolf_li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值