• Android下载更新代码


    其实是昨天反编译一个apk,给它添加一个自动更新的功能用到的。为了在smali下方便查看,代码写的不规范,反正到了smali都一个吊样~~~~

    权限:
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        //Start===========
        public void updata(){
            new Thread(){
                @Override
                public void run() {
                    request(apiUrl);
                }
            }.start();
    
        }
        String newapkName = "updata.apk";
        String apiUrl = "http://192.168.1.101:8080/udate.txt";
        //请求接口
        public void request(String Httpurl){
            URL url = null;
            try {
                url = new URL(Httpurl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                InputStream is = conn.getInputStream();
                String s = toString(is);
                JSONObject jsonObject = new JSONObject(s);
                Double versionCode = jsonObject.getDouble("versionCode"); //远程版本
                String versionName = getVersionName();
                double v = Double.parseDouble(versionName);
                if(versionCode > v){
                    //更新下载
                    downLoadFile(jsonObject.getString("updateurl"));
    
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
        Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what){
                    case 1:
                        ShowUpdataDilg();
                        break;
    
                }
            }
        };
        //版本提示对话框
        public void ShowUpdataDilg() {
            new AlertDialog.Builder(MainActivity.this)
                    .setTitle("提示")
                    .setMessage("是否安装最新版本? ")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            Uodate();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
    
                        }
                    })
                    .show();
        }
    
        //获取版本
        private String getVersionName() throws Exception
        {
            PackageManager packageManager = getPackageManager();
            // getPackageName()是你当前类的包名,0代表是获取版本信息
            PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),0);
            String version = packInfo.versionName;
            return version;
        }
    
    
        //安装apk
        public void Uodate(){
    //        String str = "/" + newapkName;
    //        String fileName = Environment.getExternalStorageDirectory() + str;
    //        Intent intent = new Intent(Intent.ACTION_VIEW);
    //        intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");
    //        startActivity(intent);
    
            String str = "/sdcard/update/" + newapkName;
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(new File(str)),
                    "application/vnd.android.package-archive");
            startActivity(intent);
    
    
    
        }
    
    //对话框确定
        public void isUpdate(){
            String str = "/" + newapkName;
            String fileNames = Environment.getExternalStorageDirectory() + str;
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(new File(fileNames)), "application/vnd.android.package-archive");
            startActivity(intent);
    
        }
    
        protected File downLoadFile(String httpUrl) {
            File tmpFile = new File("/sdcard/update");
            if (!tmpFile.exists()) {
                tmpFile.mkdir();
            }
            final File file = new File("/sdcard/update/" + newapkName);
    
            try {
                URL url = new URL(httpUrl);
                try {
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    InputStream is = conn.getInputStream();
                    FileOutputStream fos = new FileOutputStream(file);
                    byte[] buf = new byte[256];
                    conn.connect();
                    double count = 0;
                    if (conn.getResponseCode() >= 400) {
                        Toast.makeText(MainActivity.this, "连接超时", Toast.LENGTH_SHORT).show();
                    } else {
                        while (count <= 100) {
                            if (is != null) {
                                int numRead = is.read(buf);
                                if (numRead <= 0) {
                                    break;
                                } else {
                                    fos.write(buf, 0, numRead);
                                }
                            } else {
                                break;
                            }
                        }
                    }
                    fos.close();
                    is.close();
                    conn.disconnect();
                    //下载成功
                    handler.sendEmptyMessage(1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
            return file;
        }
        //输入流转换为String
        public String toString(InputStream is) {
            String result = null;
            try {
                //构造一个输出流(字节队列输出流)
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                //一个byte数组,用来存储得到的字节数据
                byte[] bys = new byte[1024];
                int len = 0;
                //循环读出完整字节数据
                while((len = is.read(bys)) != -1) {
                    baos.write(bys,0,len);
                }
                //byte数据转换为字符串
                result = new String(baos.toByteArray());
                is.close();
                baos.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }
        //End===========
  • 相关阅读:
    【设计模式】迭代器模式
    SpringMVC+Hibernate+Junit4+json基本框架近乎0配置
    Python
    Flex中TabNavigator隐藏和显示选项卡
    Android调试工具_ Stetho
    discuz的php7版本号
    分组加密的四种模式(ECB、CBC、CFB、OFB)
    人件札记:保持高效的办公室环境
    UVA 4857 Halloween Costumes 区间背包
    相机标定(Camera calibration)
  • 原文地址:https://www.cnblogs.com/yaxiaoke/p/5955765.html
Copyright © 2020-2023  润新知