Android app自动下载更新

本文介绍了一种Android应用内更新管理器的实现方法,通过自定义的AppUpDataManager类检查远程服务器上的应用版本并提示用户进行更新。文章详细展示了如何通过JSON格式的数据交换来判断是否有新版本可用,以及如何下载和安装新版本的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接使用

AppUpDataManager manager = new AppUpDataManager(this);
manager.findVersion(“http://192.168.1.195:81/file/app/“);

当然,为了开发方便,
在服务器:/file/app/文件目录下直接使用 version.txt文件,内容是json格式:{“version”:2,”appName”:”myapp.apk”},
同时还有一个安装包,myapp.apk文件,版本是2。

代码部分

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import okhttp3.OkHttpClient;
import okhttp3.Request;

/**
 * Created by lgy on 17/4/20.
 */

public class AppUpDataManager {

    private Context context;
    private String appName;
    private boolean canle = false;
    File file = null;
    String urlPath;
    AlertDialog dialog;


    private String getVersionName(Context context) throws Exception
    {
        // 获取packagemanager的实例
        PackageManager packageManager = context.getPackageManager();
        // getPackageName()是你当前类的包名,0代表是获取版本信息
        PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(),0);
        String version = packInfo.versionName;
        return version;
    }


    public AppUpDataManager(Context context) {
        super();
        this.context = context;
    }

    public void findVersion(String urlPathLink){
        urlPath = urlPathLink;
        new Thread(){
            public void run(){
                if(isNeedUpData(urlPath+"version.txt")){
                    sendHandlerMessage(0,null);
                }
            }
        }.start();
    }
    private   void sendHandlerMessage(int what,Object object){
            Message message = new Message();
            message.what = what;
            message.obj = object;
            handler.sendMessage(message);
    }
    /**
     * Creted by lgy on 17/4/21.
     */
    private  MyHandler handler = new MyHandler(this);
    private final class MyHandler extends Handler {
        private final WeakReference<AppUpDataManager> weakReference1;
        public MyHandler(AppUpDataManager manager){
            weakReference1 = new WeakReference<AppUpDataManager>(manager);
        }

        @Override
        public void handleMessage(Message msg) {
            final AppUpDataManager manager = weakReference1.get();
            if(manager != null){
                switch (msg.what){
                    case 0:
                        new AlertDialog.Builder(manager.context).setTitle("更新提示").
                                setMessage("发现新版本,是否需要跟新?").setPositiveButton("更新",new DialogInterface.OnClickListener(){
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                downLoadFile(urlPath);
                                showAlertDialog(manager.context);
                                canle = false;
                            }
                        }).setNegativeButton("取消",null).create().show();
                        break;
                    case 1:
                        sAlertDialogMessage(msg.obj.toString());
                        break;
                    case 2:
                        dialog.dismiss();
                        installApk(manager.context);
                        break;
                }
            }
        }
    }

    public Boolean isNeedUpData(String url){
        boolean flag = false;
        OkHttpClient client = new OkHttpClient();
        File file = null;
        try {
            Request request = new Request.Builder().url(url).build();
            String response = client.newCall(request).execute().body().string();
            JSONObject jsonObject;
            jsonObject = new JSONObject(response);
            Double thisVersion = Double.valueOf(getVersionName(context));
            int version = Integer.valueOf(jsonObject.getString("version"));
            if (version > thisVersion) {
                flag = true;
                appName = jsonObject.getString("appName");
            }
        }catch (Exception e){
            Log.e("isNeedUpData",e.getMessage());
        }
        return flag;
    }

    //下载apk程序代码
    protected void downLoadFile(final String urlLink) {
        new Thread(){
            public void run(){
                OkHttpClient client = new OkHttpClient();
                // 判断SD卡是否存在,并且是否具有读写权限
                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    // 获得存储卡的路径
                    String sdpath = Environment.getExternalStorageDirectory() + "/update";
                    File tmpFile = new File(sdpath);
                    if (!tmpFile.exists()) {
                        tmpFile.mkdir();
                    }
                    try {
                        URL url = new URL(urlLink+appName);
                        file = new File(sdpath + appName);
                        try {
                            HttpURLConnection conn = (HttpURLConnection) url
                                    .openConnection();
                            conn.connect();
                            // 获取文件大小
                            int length = conn.getContentLength();
                            InputStream is = conn.getInputStream();
                            FileOutputStream fos = new FileOutputStream(file);
                            byte[] buf = new byte[1024];
                            int count = 0;
                            if (is != null) {
                                int numRead = 0;
                                do{
                                    numRead = is.read(buf);
                                    count += numRead;
                                    if (numRead <= 0) {
                                        break;
                                    } else {
                                        fos.write(buf, 0, numRead);
                                    }
                                    sendHandlerMessage(1,"正在下载更新包,已下载"+count*100/length+"%");
                                }while (canle == false);
                            }
                            fos.close();
                            is.close();
                            sendHandlerMessage(2,"更新成功!");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }


                }
            }
        }.start();
    }
    /**
     * 安装APK文件
     */
    private void installApk(Context context)
    {
        // 通过Intent安装APK文件
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
        context.startActivity(i);
    }

    TextView megView;
    private void showAlertDialog(Context context){
        megView = new TextView(context);
        megView.setTextSize(18);
        megView.setPadding(50,5,10,5);
        megView.setText("正在下载更新包,已下载0%");
        AlertDialog.Builder builder = new AlertDialog.Builder(context).setTitle("正在下载").setView(megView).setPositiveButton("取消更新",new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                canle = true;
            }
        });
        dialog = builder.create();
        dialog.show();
    }
    private  void sAlertDialogMessage(String msg){
        megView.setText(msg);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值