downApk

来源:互联网 发布:尤因和奥拉朱旺的数据 编辑:程序博客网 时间:2024/06/12 21:06

activity_main.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.xiazai.MainActivity" >    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="下载APk"         android:onClick="downloadApk"/></RelativeLayout>

MainActivity.java

package com.example.xiazai;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.View;public class MainActivity extends Activity {private String apkUri = "http://192.168.30.41:8080/android/Storage.apk";// 下载进度条目private ProgressDialog pd;//下载安装的目录地址private File apkFile;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 加载视图文件setContentView(R.layout.activity_main);}// 为按钮添加单击事件public void downloadApk(View view) {// 显示下载进度条showProgressDialog();// 准备一个保存apk的file对象createApkFile();// 启动分现场下载,下载过程更新进度,下载完成移除并安装startDownApk();}/** * 显示下载进度条目 */private void showProgressDialog() {// 创建一个进度条pd = new ProgressDialog(this);// 设置进度条的样式pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 点击其他位置进度条不会消失pd.setCancelable(false);// 显示出来pd.show();}/** * 如果sd可以用,保存在sd卡---> storage/sdcard/Andriod/data/包名/ * 如果不可用保存在手机内部files---> data/data/包名/files/ */private void createApkFile() {File fileDir = null;//判断sd卡是否处于挂载的状态if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {fileDir = getExternalFilesDir(null);} else {fileDir = getFilesDir();}//创建好文件夹的地址信息apkFile = new File(fileDir, "test1.apk");try {if (apkFile.exists()) {apkFile.delete();}else {//正式创建一个文件夹apkFile.createNewFile();}} catch (IOException e) {e.printStackTrace();}}/** * 下载apk */private void startDownApk() {new Thread(new Runnable() {@Overridepublic void run() {try {//创建url对象URL url = new URL(apkUri);// 打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置时间--get请求conn.setRequestMethod("GET");conn.setDoInput(true);//conn.setDoOutput(true);  这个注释掉,打开就是post请求conn.setReadTimeout(5000);conn.setConnectTimeout(5000);// 连接conn.connect();// 判断相应码if (conn.getResponseCode() == 200) {// 读取数据InputStream is = conn.getInputStream();// 得到文件的大小int contentLength = conn.getContentLength();// 设置进度条的最大值pd.setMax(contentLength);// 读到文件里FileOutputStream fos = new FileOutputStream(apkFile);byte[] buffer = new byte[5000];int len = 0;while ((len = is.read(buffer))!=-1) {fos.write(buffer, 0, len);pd.incrementProgressBy(len);Thread.sleep(200);}fos.close();is.close();// 出循环写完了pd.dismiss();// 启动一个activityinstallAPK();}} catch (Exception e) {e.printStackTrace();}}}).start();}/** * 安装APK */public void installAPK() {Intent intent = new Intent();//创建一个带行为的intent对象intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(apkFile),"application/vnd.android.package-archive");//启动窗口界面startActivity(intent);}}



0 0