优秀的编程知识分享平台

网站首页 > 技术文章 正文

Android Studio实现APK的更新、下载、安装

nanyue 2024-09-02 19:12:32 技术文章 6 ℃
package MyClass;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.example.fucm.wms_jianh.R;

import org.json.JSONArray;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by fucm on 2016-07-06.
 */
public class SoftUpdate {

    /* 下载中 */
    private static final int DOWNLOAD = 1;
    /* 下载结束 */
    private static final int DOWNLOAD_FINISH = 2;
    /* 保存解析的XML信息 */
    private Long str_version;
    private String str_appname;
    private String str_downurl;
    /* 下载保存路径 */
    private String mSavePath;
    /* 记录进度条数量 */
    private int progress;
    /* 是否取消更新 */
    private boolean cancelUpdate = false;

    private Context mContext;
    /* 更新进度条 */
    private ProgressBar mProgress;
    private Dialog mDownloadDialog;

    public SoftUpdate(Context context)
    {
        this.mContext = context;
    }

    private Handler mHandler = new Handler
    {
       public void handleMessage(Message msg)
        {
 switch (msg.what)
 {
 // 正在下载
 case DOWNLOAD:
 // 设置进度条位置
 mProgress.setProgress(progress);
 break;
 case DOWNLOAD_FINISH:
 // 安装文件
 installApk;
 break;
 default:
 break;
 }
        };
    };

    /**
     * 检测软件更新
     */
    public void checkUpdate
    {
        if (isUpdate)
        {
 // 显示提示对话框
 showNoticeDialog;
        } else
        {
 Toast.makeText(mContext, R.string.soft_update_no, Toast.LENGTH_LONG).show;
        }
    }

    /**
     * 检查软件是否有更新版本
     *
     * @return
     */
    private boolean isUpdate{
        // 获取当前软件版本
        int versionCode = getVersionCode(mContext);
        //通过服务器获得版本号
        try {
 String str = HttpHelper.sendHttpRequest("http://127.0.0.1/Service1.svc/get_version");
 JSONArray json1 =HttpHelper.GetJsonValue(str);
 str_version=json1.getLong(0);
 str_appname=json1.getString(1);
 str_downurl=json1.getString(2);
 if (str_version > versionCode) {
 return true;
 }
        }
        catch (Exception e) {
 //strError=e.toString;
        }
        return false;
    }

    /**
     * 获取软件版本号
     *
     * @param context
     * @return
     */
    private int getVersionCode(Context context)
    {
        int versionCode = 0;
        try
        {
 // 获取软件版本号,对应AndroidManifest.xml下android:versionCode
 versionCode = context.getPackageManager.getPackageInfo("com.example.fucm.wms_jianh", 0).versionCode;
        } catch (PackageManager.NameNotFoundException e)
        {
 e.printStackTrace;
        }
        return versionCode;
    }

    /**
     * 显示软件更新对话框
     */
    private void showNoticeDialog
    {
        // 构造对话框
        AlertDialog.Builder builder = new Builder(mContext);
        builder.setTitle(R.string.soft_update_title);
        builder.setMessage(R.string.soft_update_info);
        // 更新
        builder.setPositiveButton(R.string.soft_update_updatebtn, new OnClickListener
        {
 @Override
 public void onClick(DialogInterface dialog, int which)
 {
 dialog.dismiss;
 // 显示下载对话框
 showDownloadDialog;
 }
        });
        // 稍后更新
        builder.setNegativeButton(R.string.soft_update_later, new OnClickListener
        {
 @Override
 public void onClick(DialogInterface dialog, int which)
 {
 dialog.dismiss;
 }
        });
        Dialog noticeDialog = builder.create;
        noticeDialog.show;
    }

    /**
     * 显示软件下载对话框
     */
    private void showDownloadDialog
    {
        // 构造软件下载对话框
        AlertDialog.Builder builder = new Builder(mContext);
        builder.setTitle(R.string.soft_updating);
        // 给下载对话框增加进度条
        final LayoutInflater inflater = LayoutInflater.from(mContext);
        View v = inflater.inflate(R.layout.soft_update, null);
        mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
        builder.setView(v);
        // 取消更新
        builder.setNegativeButton(R.string.soft_update_cancel, new OnClickListener
        {
 @Override
 public void onClick(DialogInterface dialog, int which)
 {
 dialog.dismiss;
 // 设置取消状态
 cancelUpdate = true;
 }
        });
        mDownloadDialog = builder.create;
        mDownloadDialog.show;
        // 现在文件
        downloadApk;
    }

    /**
     * 下载apk文件
     */
    private void downloadApk
    {
        // 启动新线程下载软件
        new downloadApkThread.start;
    }

    /**
     * 下载文件线程
     *
     * @author coolszy
     *@date 2012-4-26
     *@blog http://blog.92coding.com
     */
    private class downloadApkThread extends Thread
    {
        @Override
        public void run
        {
 try
 {
 // 判断SD卡是否存在,并且是否具有读写权限
 if (Environment.getExternalStorageState.equals(Environment.MEDIA_MOUNTED))
 {
 // 获得存储卡的路径
 String sdpath = Environment.getExternalStorageDirectory + "/";
 mSavePath = sdpath + "download";
 URL url= new URL(str_downurl);
 // 创建连接
 HttpURLConnection conn = (HttpURLConnection) url.openConnection;
 conn.connect;
 // 获取文件大小
 int length = conn.getContentLength;
 // 创建输入流
 InputStream is = conn.getInputStream;

 File file = new File(mSavePath);
 // 判断文件目录是否存在
 if (!file.exists)
 {
 file.mkdir;
 }
 File apkFile = new File(mSavePath, str_appname);
 FileOutputStream fos = new FileOutputStream(apkFile);
 int count = 0;
 // 缓存
 byte buf = new byte[1024];
 // 写入到文件中
 do
 {
 int numread = is.read(buf);
 count += numread;
 // 计算进度条位置
 progress = (int) (((float) count / length) * 100);
 // 更新进度
 mHandler.sendEmptyMessage(DOWNLOAD);
 if (numread <= 0)
 {
 // 下载完成
 mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
 break;
 }
 // 写入文件
 fos.write(buf, 0, numread);
 } while (!cancelUpdate);// 点击取消就停止下载.
 fos.close;
 is.close;
 }
 } catch (MalformedURLException e)
 {
 e.printStackTrace;
 } catch (IOException e)
 {
 e.printStackTrace;
 }
 // 取消下载对话框显示
 mDownloadDialog.dismiss;
        }
    };

    /**
     * 安装APK文件
     */
    private void installApk
    {
        File apkfile = new File(mSavePath, str_appname);
        if (!apkfile.exists)
        {
 return;
        }
        // 通过Intent安装APK文件
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.parse("file://" + apkfile.toString), "application/vnd.android.package-archive");
        mContext.startActivity(i);
    }

}
最近发表
标签列表