android APK升级

来源:互联网 发布:手机淘宝排名提升 编辑:程序博客网 时间:2024/05/19 01:07
1.获取版本号
2.对比版本号
3.下载apk文件
4.启动安装
/** * 升级 * * @param view */public void onUpgrade(View view) {    if (isUpgrade) {        return;    }    isUpgrade = true;    mUpdateAPKThread = new UpdateAPKThread(this, "url");    new UpgradeThread().start();

}

class UpgradeThread extends Thread {    @Override    public void run() {        super.run();        boolean flag = mUpdateAPKThread.checkIsNeedUpdate();        Message msg = Message.obtain();        msg.what = KEY_UPGRADE;        Bundle bundle = new Bundle();        bundle.putBoolean("upgrade", flag);        msg.setData(bundle);        handler.sendMessage(msg);    }}
case KEY_UPGRADE:    if (msg.getData().getBoolean("upgrade")) {        String message = mUpdateAPKThread.getDetail();        new AlertDialog.Builder(LoginActivity.this)                .setCancelable(false)                .setTitle(getString(R.string.upgrade))                .setMessage(message)                .setPositiveButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        mProgressDialog = new MyProgressDialog(LoginActivity.this, getString(R.string.load), false);                        mUpdateAPKThread.startDownloadThread();                        isUpgrade = false;                    }                })                .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        isUpgrade = false;                    }                }).create().show();    } else {        Yancy.warning(LoginActivity.this, getString(R.string.version)).show();        isUpgrade = false;    }    break;
/** * 文件长度 */private int max = 0;@Overridepublic void setMax(int length) {    max = length;}@Overridepublic void setProgresss(int len) {    mProgressDialog.setProgress(len * 100 / max);}@Overridepublic void onSuccess() {    mUpdateAPKThread.installApk();    mProgressDialog.dismiss();}@Overridepublic void onFail() {    Yancy.error(this, getString(R.string.download_failed)).show();    mProgressDialog.dismiss();}

package com.yancy.sdk.upgrade;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager.NameNotFoundException;import android.net.Uri;import android.os.Environment;import android.os.Handler;import android.os.Looper;import com.yancy.sdk.app.App;import com.yancy.sdk.utils.AppUtils;import org.json.JSONException;import org.json.JSONObject;import java.io.ByteArrayOutputStream;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;/** * create by dpc on 2017-5-10 */public class UpdateAPKThread {    private Context mContext;    private String strURL;    private File downloadFile;    private DownloadListener downloadListener;    private String detail;    private String varUrl;    private String apkName;    private Handler mHandler = new Handler(Looper.getMainLooper()) {        public void handleMessage(android.os.Message msg) {            switch (msg.what) {                case 0:                    downloadListener.setMax((int) msg.obj);                    break;                case 1:                    downloadListener.setProgresss((int) msg.obj);                    break;                case 2:                    downloadListener.onSuccess();                    break;                case 3:                    downloadListener.onFail();                    break;                default:                    break;            }        }    };    public UpdateAPKThread(Context mContext, String strURL) {        this.mContext = mContext;        this.strURL = strURL;        setDownloadListener((DownloadListener) mContext);    }    public void setDownloadListener(DownloadListener downloadListener) {        this.downloadListener = downloadListener;    }    public interface DownloadListener {        /**         * 设置文件长度         *         * @param length         */        void setMax(int length);        /**         * 进度         *         * @param len         */        void setProgresss(int len);        /**         * 成功         */        void onSuccess();        /**         * 失败         */        void onFail();    }    /**     * 是否需要更新     *     * @return     */    public boolean checkIsNeedUpdate() {        if (strURL.equals("")) {            return false;        }        String data = getJsonContent(strURL);        if (data.equals("")) {            return false;        }        return parseJson(mContext, data);    }    private boolean parseJson(Context context, String strResult) {        try {            JSONObject jsonObject = new JSONObject(strResult);            String verName = jsonObject.getString("verName");            String verCode = jsonObject.getString("verCode");            varUrl = jsonObject.getString("varUrl");            detail = jsonObject.getString("detail");            apkName = jsonObject.getString("apkname");            int code = Integer.parseInt(verCode);            if (code > AppUtils.getVersionCode(context)) {                return true;            }        } catch (JSONException e) {            e.printStackTrace();        } catch (NumberFormatException e) {            e.printStackTrace();        }        return false;    }    private String getJsonContent(String urlStr) {        try {            URL url = new URL(urlStr);            HttpURLConnection httpConn = (HttpURLConnection) url                    .openConnection();            // 设置连接属性            httpConn.setConnectTimeout(3000);            httpConn.setDoInput(true);            httpConn.setRequestMethod("GET");            httpConn.connect();            if (200 == httpConn.getResponseCode()) {                return ConvertStream2Json(httpConn.getInputStream());            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return "";    }    private String ConvertStream2Json(InputStream inputStream) {        String jsonStr = "";        ByteArrayOutputStream out = new ByteArrayOutputStream();        byte[] buffer = new byte[1024];        int len = 0;        try {            while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) {                out.write(buffer, 0, len);            }            jsonStr = new String(out.toByteArray());        } catch (IOException e) {            e.printStackTrace();        }        return jsonStr;    }    public String getDetail() {        return detail;    }    Thread mThread;    boolean isDownloading = false;    public void startDownloadThread() {        final String urlStr = varUrl;        final String fileName = apkName;        mThread = new Thread() {            public void run() {                isDownloading = true;                try {                    URL url = new URL(urlStr);                    HttpURLConnection conn = (HttpURLConnection) url                            .openConnection();                    // 获得文件的长度                    int contentLength = conn.getContentLength();                    mHandler.obtainMessage(0, contentLength).sendToTarget();                    File filePath = new File(Environment.getExternalStorageDirectory() + "/apk/");                    if (!filePath.exists()) {                        filePath.mkdirs();                        filePath = new File(Environment.getExternalStorageDirectory() + "/apk/" + "/.test.txt");                        if (!filePath.exists())                            try {                                filePath.createNewFile();                            } catch (IOException e) {                                e.printStackTrace();                            }                        FileNotification.updateNotify(filePath);                    }                    String pathName = Environment.getExternalStorageDirectory() + "/apk/" + fileName;                    downloadFile = new File(pathName);                    InputStream input = conn.getInputStream();                    if (downloadFile.exists()) {                        downloadFile.delete();                    }                    downloadFile.createNewFile();                    FileOutputStream output = new FileOutputStream(downloadFile);                    byte[] buffer = new byte[1024];                    int len; // 重要参数                    int sum = 0;                    while ((len = input.read(buffer)) != -1 && isDownloading) {                        sum += len;                        mHandler.obtainMessage(1, sum).sendToTarget();                        output.write(buffer, 0, len);                        Thread.sleep(1);                    }                    output.close();                    input.close();                    mHandler.obtainMessage(2).sendToTarget();                } catch (IOException e1) {                    mHandler.obtainMessage(3).sendToTarget();                    e1.printStackTrace();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };        mThread.start();    }    /**     * 安装APK文件     */    public void installApk() {        if (downloadFile != null && !downloadFile.exists()) {            return;        }        Intent i = new Intent(Intent.ACTION_VIEW);        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        i.setDataAndType(Uri.parse("file://" + downloadFile.toString()),                "application/vnd.android.package-archive");        mContext.startActivity(i);    }}



原创粉丝点击