精华内容
下载资源
问答
  • 这个demo实现了android开发应用内下载安装apk升级版本的功能,非常简便轻量集成,完全原生代码即可实现,无需第三方框架。。。
  • APK升级安装

    千次阅读 2018-04-11 12:54:02
    进入 APK 时,弹框提示升级 进入 APK 后,点击升级按钮提示升级 二、升级流程 访问服务器端最新 APK 的版本 server_version 获取本地已安装 APK 的版本 local_version 对比 server_version 和 local_version 的大小 ...

    一、需求

    1. 进入 APK 时,弹框提示升级
    2. 进入 APK 后,点击升级按钮提示升级

    二、升级流程

    1. 访问服务器端最新 APK 的版本 server_version
    2. 获取本地已安装 APK 的版本 local_version
    3. 对比 server_version 和 local_version 的大小
    4. 若 server_version > local_version,则弹框提示升级
    5. 点击弹框中的取消按钮,不升级
    6. 点击弹框中的升级按钮,开始下载服务器端最新 APK
    7. 弹框提示下载进度
    8. 下载完成,进入安装界面
    9. 点击安装,升级完成

    三、升级案例

    3.1 服务端

    准备:

    1. 记得添加 gson 的 jar 包到 path 路径
    2. 把服务器的 APK 放到 WebContent 目录下

    开始:
    1. 使用 Eclipse 创建 Dynamic Web Project
    创建 Dynamic Web Project
    2. 项目名称 UpdateApk
    项目名称
    3. 项目 UpdateApk 目录结构
    UpdateApk 目录结果
    4. 右键 src–New–Servlet,创建 CheckVersionServlet(用于获取服务器 APK 版本)和UpdateApkServlet(用户下载更新 APK)
    5. CheckVersionServlet.java

    @WebServlet("/CheckVersionServlet")
    public class CheckVersionServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            // 服务器版本
            float serverVersion = ApkInfo.SERVER_VERSION;
            Gson gson = new Gson();
            ApkModel apkModel = new ApkModel();
            apkModel.setData(serverVersion);
            String json = gson.toJson(apkModel);
            out.println(json);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    -
    6. UpdateApkServlet

    @WebServlet("/UpdateApkServlet")
    public class UpdateApkServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //设置响应类型
            response.setContentType("text/html;charset=UTF-8");
            // 获取请求参数 user_version,对应客户端 APK 版本
            String user_version_name = request.getParameter("user_version");
            float user_version;
            try {
                //请求参数 user_version 对应的字符串转为 float 类型的值
                user_version = Float.valueOf(user_version_name);
            } catch (NullPointerException | NumberFormatException e) {//数字转换异常,则请求参数 user_version 格式无效,不能转为 float 类型
                PrintWriter out = response.getWriter();
                ApkModel apkModel = new ApkModel();
                apkModel.setData("请求参数 user_version 格式无效,不能转为 float 类型");
                Gson gson = new Gson();
                String json = gson.toJson(apkModel);
                out.println(json);
                //请求参数 user_version 格式无效,直接返回
                return;
            }
    
            //请求参数 user_version 格式有效,可转为 float 类型
            //服务器 APK 版本
            float server_version = ApkInfo.SERVER_VERSION;
            //客户端 APK 版本小于服务器 APK 版本
            if (user_version < server_version) {
                //服务器 APK 的路径
                String apkPath = getServletContext().getRealPath("/");
                //服务器 APK 的名称
                String apkName = ApkInfo.SERVER_APK_NAME;
                //根据 APK 所在路径创建 APK 文件
                File apkFile = new File(apkPath + File.separator + apkName);
                //文件存在
                if (apkFile.exists()) {
                    //在下载框默认显示的文件名
                    String downloadFilename = ApkInfo.SERVER_APK_NAME;
                    //设置在下载框默认显示的文件名
                    response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);
    
                    //设置文件长度
                    response.setContentLength((int) apkFile.length());
                    //指定返回对象是文件流
                    response.setContentType("application/octet-stream");
    
                    //获取 APK 文件的输入流
                    InputStream is = new FileInputStream(apkFile);
                    BufferedInputStream bis = new BufferedInputStream(is);
                    //缓冲
                    byte[] buffer = new byte[bis.available()];
                    //读到缓冲中
                    bis.read(buffer);
    
                    //获取服务端的输出流
                    ServletOutputStream os = response.getOutputStream();
                    //把缓冲写到输出流中
                    os.write(buffer);
                    os.flush();
    
                    //关闭各种流
                    is.close();
                    bis.close();
                    os.close();
                }
            }
    
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    -
    7. ApkModel

    public class ApkModel {
    
        /**
         * 服务器返回给客户端的信息,可能是字符串,也可能是其它数据类型
         */
        private Object data;
    
        public void setData(Object data) {
            this.data = data;
        }
    
        public Object getData() {
            return data;
        }
    
    }

    -
    8. ApkInfo

    public class ApkInfo {
    
        //服务器 APK 的版本,假设为 2.0
        public static final float SERVER_VERSION = 2.0f;
    
        //服务器 APK 的名称,和 WebContent 下 APK 文件名一致
        public static final String SERVER_APK_NAME = "new.apk";
    
    }

    3.2 客户端

    准备:

    获取本机 IP:打开 cmd 命令行窗口,输入 ipconfig 后回车,或通过 ‘打开”网络和 Intent”设置’—查看网络属性—IPv4地址查看
    获取服务器最新 APK 版本接口:http://你的 IP 地址:8080/UpdateApk/CheckVersionServlet
    下载服务器最新 APK 接口:http://你的 IP 地址:8080/UpdateApk/UpdateApkServlet?user_version=x.x(x.x,如1.0)
    使用自定义的 HttpUtils 网络访问框架访问网络,可用使用其它的方式访问网络

    开始:
    1. 访问网络,获取服务器最新 APK 的版本,若有最新版本且版本大于已安装版本,则弹框提示升级

    /**
     * 检测 APK 是否需要升级
     */
    private void checkUpdate() {
        /**
         * 请求网络
         */
        HttpUtils.with(this)
                .url("http://你的 IP 地址:8080/UpdateApk/CheckVersionServlet")
                .execute(new HttpCallBack<ApkInfoModel>() {
                    @Override
                    public void onSuccess(final ApkInfoModel apkInfoModel) {
                        Log.e("tag", "local: " + ApkInfoUtils.getLocalApkVersion(MainActivity.this) + ", server: " + apkInfoModel.getData());
    
                        //成功回调
                        if (apkInfoModel != null && ApkInfoUtils.isNeedUpdate(MainActivity.this, apkInfoModel.getData())) {
                            AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
                                    .setMessage("当前有新版本,是否进行升级?")
                                    .setNegativeButton("否", null)
                                    .setPositiveButton("是", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            //使用 ApkDownLoader 下载 APK
                                            ApkDownLoader.init(MainActivity.this).downLoadApk(apkInfoModel.getData(), "http://你的 IP 地址:8080/UpdateApk
    /UpdateApkServlet");
                                        }
                                    }).create();
                            dialog.show();
                        } else {
                            Toast.makeText(MainActivity.this, "不需要升级", Toast.LENGTH_SHORT).show();
                        }
                    }
    
                    @Override
                    public void onError(Exception e) {
                        //失败回调
                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
    }

    -
    2. ApkDownLoader

    public class ApkDownLoader {
    
        //APK 下载文件村路径
        public static final String SD_FOLDER = Environment.getExternalStorageDirectory() + "/download";
        //APK 下载文件
        private static File mApkFile;
    
        //下载进度提示框
        private static ProgressDialog pd;
        //最大进度
        private static final int MAX_PROGRESS = 100;
    
        //Handler:下载中,显示进度消息
        private static final int MSG_SHOW_PROGRESS = 1;
        //Handler:下载完成,安装 APK 消息
        private static final int MSG_INSTALL_APK = 2;
        //Handler 处理下载消息
        private MyHandler handler;
    
        //上下文
        private Context mContext;
    
        private ApkDownLoader(Context context) {
            this.mContext = context;
        }
    
        /**
         * 初始化 ApkDownLoader
         * @param context 上下文
         * @return ApkDownLoader
         */
        public static ApkDownLoader init(Context context) {
            return new ApkDownLoader(context);
        }
    
        /**
         * @param serverApkVersion
         * @param url
         */
        public void downLoadApk(float serverApkVersion, final String url) {
            showProgressDialog();
    
            handler = new MyHandler(this);
    
            downloadFile(mContext, url);
        }
    
        /**
         * 显示下载进度框
         */
        private void showProgressDialog() {
            pd = new ProgressDialog(mContext);
            pd.setCancelable(false);//不能取消
            pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pd.setMessage("正在下载安装包,请稍后");
            pd.setTitle("版本升级");
            pd.setMax(MAX_PROGRESS);//最大进度
            pd.create();
            pd.show();
        }
    
        private void downloadFile(final Context context, String url) {
            /**
             * 请求网络
             */
            HttpUtils.with(mContext).get()
                    .url(url)
                    .addParam("user_version", "" + ApkInfo.getLocalApkVersion(context))
                    .execute(new IEngineCallBack() {
    
                        @Override
                        public void onSuccess(Response result) {
                            //SD 卡可用,下载最新 apk
                            if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
                                InputStream is = null;
                                OutputStream os = null;
                                //成功回调
                                try {
                                    //获取输入流
                                    is = result.body().byteStream();
                                    //创建最新 apk 文件
                                    mApkFile = new File(SD_FOLDER, "new.apk");
                                    //apk 保存所在目录不存在
                                    if (!mApkFile.getParentFile().exists()) {
                                        //创建 apk 保存所在目录
                                        mApkFile.getParentFile().mkdirs();
                                    }
                                    os = new FileOutputStream(mApkFile);
                                    int len;
                                    int total = 0;
                                    byte[] buffer = new byte[1024];
                                    while ((len = is.read(buffer)) != -1) {
                                        os.write(buffer, 0, len);
                                        total += len;
    
                                        //通过 handler 发送消息,更新下载进度
                                        Message msg = Message.obtain();
                                        msg.what = MSG_SHOW_PROGRESS;
                                        msg.arg1 = total;
                                        handler.sendMessage(msg);
                                    }
                                } catch (IOException e) {
                                    e.printStackTrace();
                                } finally {
                                    //关闭输出流
                                    IOExceptionCloser.close(os);
                                    //关闭输入流
                                    IOExceptionCloser.close(is);
                                }
                            } else {
                                //提示 SD 卡不可用
                                HttpUtils.handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(context, "SD 卡不可用", Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        }
    
                        @Override
                        public void onError(Exception e) {
                            Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    });
        }
    
        /**
         * Handler 处理下载消息
         */
        private static class MyHandler extends Handler {
    
            private WeakReference<ApkDownLoader> reference;
    
            public MyHandler(ApkDownLoader apkDownLoader) {
                reference = new WeakReference<ApkDownLoader>(apkDownLoader);
            }
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
    
                if (reference == null || reference.get() == null) {
                    return;
                }
    
                switch (msg.what) {
                    case MSG_SHOW_PROGRESS:
                        //显示下载进度通知
                        reference.get().showDownloadProgress(msg.arg1);
                    case MSG_INSTALL_APK:
                        //安装 APK
                        reference.get().installApk();
                        break;
                }
            }
        };
    
        /**
         * 安装 APK
         */
        private void installApk() {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            File file = new File(mApkFile.getAbsolutePath());
            Uri uri;
            //Android 版本大于 7.0,需要使用 FileProvider 获取文件访问的权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                uri = FileProvider.getUriForFile(mContext, "你的应用包名.provider", file);
            } else {//Android 版本小于 7.0,直接使用文件即可
                uri = Uri.fromFile(file);
            }
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //启动安装界面进行安装
            mContext.startActivity(intent);
        }
    
        /**
         * 显示下载进度
         * @param progress 当前进度,最大进度为 100
         */
        private void showDownloadProgress(int progress) {
            //设置当前下载进度
            pd.setProgress(progress);
    
            //进度为 100,下载完成
            if (progress == MAX_PROGRESS) {
                pd.setMessage("下载完毕");
                //发送下载完成消息
                handler.sendEmptyMessage(MSG_INSTALL_APK);
            }
        }
    }

    -
    3. ApkInfoModel

    public class ApkInfoModel {
    
        private float data;
    
        public float getData() {
            return data;
        }
    }

    -
    4. ApkInfoUtils

    public class ApkInfoUtils {
    
        /**
         * 获取本地 APK 版本
         * @param context 上下文
         * @return 本地 APK 版本
         */
        public static float getLocalApkVersion(Context context) {
            try {
                String localPackage = context.getPackageName();
                PackageInfo packageInfo = context.getPackageManager().getPackageInfo(localPackage, 0);
                return Float.valueOf(packageInfo.versionName);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return 0;
        }
    
        /**
         * APK 是否需要升级
         * @param context 上下文
         * @param serverApkVersion 服务器端 APK 版本号
         * @return
         */
        public static boolean isNeedUpdate(Context context, float serverApkVersion) {
            float localApkVersion = getLocalApkVersion(context);
            if (serverApkVersion > localApkVersion) {
                return true;
            }
            return false;
        }
    }

    -
    5. IOExceptionCloser

    public class IOExceptionCloser {
    
        public static void close(Closeable io) {
            if (io != null) {
                try {
                    io.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    注意
    1. Android 7.0 开始需要使用 FileProvider 来获取其他应用的文件访问权限,需要在 AndroidManifest.xml 文件的 application 标签内注册一个 provider

    <provider
        android:authorities="你的应用包名.provider"//必须保证唯一
        android:name="android.support.v4.content.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
    
        <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    
    </provider>

    -
    2. provider_paths.xml:存放在 res/xml 下

    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path
            name="external_path"
            path="download"/>
    </paths>

    -
    3. 注册相关权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    关于 Android 6.0 运行时权限的处理找个 demo 看一看,然后用一用就好了
    至此,APK 升级安装的功能就基本实现了

    展开全文
  • 1.权限 在Android8.0版本及其以上需要有安装权限才能够进行安装,否则,包下载完成之后,不会弹出安装界面。具体权限如下: <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /&...

    1.权限

    在Android8.0版本及其以上需要有安装权限才能够进行安装,否则,包下载完成之后,不会弹出安装界面。具体权限如下:

    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

    2.吊起安装界面代码块

    private void reSetupApk() {
    
        Intent intentUpdate = new Intent("android.intent.action.VIEW");
    
        intentUpdate.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
        File file = new File(Constant.SDCARD_DOWNLOAD_PATH + "/" + fileName);
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //对Android N及以上的版本做判断
    
            Uri apkUriN = FileProvider.getUriForFile(mContext,
    
                    mContext.getApplicationContext().getPackageName() + ".provider", file);
    
            intentUpdate.addCategory("android.intent.category.DEFAULT");
    
            intentUpdate.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);   //添加Flag 表示我们需要什么权限
    
            intentUpdate.setDataAndType(apkUriN, "application/vnd.android.package-archive");
    
        } else {
    
            Uri apkUri = Uri.fromFile(file);
    
            intentUpdate.setDataAndType(apkUri, "application/vnd.android.package-archive");
    
        }
    
        mContext.startActivity(intentUpdate);
    
    }

    3.配置文件提供者信息

    <provider
    
        android:name="android.support.v4.content.FileProvider"
    
        android:authorities="${applicationId}.provider"
    
        android:exported="false"
    
        android:grantUriPermissions="true">
    
        <meta-data
    
            android:name="android.support.FILE_PROVIDER_PATHS"
            //定位到文件路径过滤器
            android:resource="@xml/provider_paths" />
    
    </provider>

    4.配置文件路径过滤器

    在res下新建xml文件夹,然后创建provider_paths文件,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
    
        <external-path
    
            name="external_files"
    
            path="." />

    path属性可定位到具体的文件夹,限制达到安全的考虑,android:pathPrefix、android:path或android:pathPatten进行最小化访问路径申明和最小权限申明。可防止客户端本地数据允许被第三方应用读取、利用,易造成敏感数据泄露。

    展开全文
  • 一个测试APK升级的程序,主要是Android上用的。
  • 最近工作由于换了电脑,打了APK包一直不能升级成功,老是报错APK签名与原来APK的签名不一致,而我都把签名文件拷贝过来了还是有问题。后来经过同事指点才发现不仅要签名文件一样,别名也要一致哦。 这里签名...

    最近工作由于换了电脑,打了APK包一直不能升级成功,老是报错APK签名与原来APK的签名不一致,而我都把签名文件拷贝过来了还是有问题。后来经过同事指点才发现不仅要签名文件一样,别名也要一致哦。

     

    这里签名文件的名字要与别名一致才可以!!!

    展开全文
  • APK升级更新,打包

    2016-09-05 14:40:32
    Android studio 打包APK   第二步 如果有创建打包APK 就直接下一步 如果没有,就选择Create new 创建 第三步找到打包后的APK 项目 → app→ build→ outputs→ apk ...

    Android studio  打包APK

              

    第二步     如果有创建打包APK  就直接下一步     如果没有,就选择Create new  创建

    第三步找到打包后的APK

    项目 → app→ build→ outputs→ apk










    获得版本号

       /**
         * 获得版本号
         *
         * @param context
         * @return
         */
        public static String getVersion(Context context) {
            String version = null;
            PackageManager packageManager = context.getPackageManager();
            PackageInfo packageInfo;
            try {
                packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
                return packageInfo.versionName;
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            return version;
        }


    APK文件路径

    	public static String getFileMd5(File file) {
    		if (!file.isFile()) {
    			return null;
    		}
    		MessageDigest digest = null;
    		FileInputStream in = null;
    		byte buffer[] = new byte[1024];
    		int len;
    		try {
    			digest = MessageDigest.getInstance("MD5");
    			in = new FileInputStream(file);
    			while ((len = in.read(buffer, 0, 1024)) != -1) {
    				digest.update(buffer, 0, len);
    			}
    			in.close();
    		} catch (Exception e) {
    			return null;
    		} finally {
    			if (in != null) {
    				try {
    					in.close();
    				} catch (IOException e) {
    					// ignore
    				}
    			}
    		}
    
    		BigInteger bigint = new BigInteger(1, digest.digest());
    		return bigint.toString(16);
    	}
    


    Apk下载工具类

    public class ApkDownloader extends Thread {
    
    	public static final int APK_DOWNLOAD_PROGRESS = 0;
    
    	public static final String APK_DOWNLOAD_PROGRESS_EXTRA = "apk.download.progress";
    
    	public static final int APK_DOWNLOAD_SUCESS = 1;
    
    	public static final String APK_DOWNLOAD_FAIL_EXTRA = "apk.download.fail.msg";
    
    	public static final int APK_DOWNLOAD_FAIL = 2;
    
    	public static final int APK_NEW_VERSION = 3;
    	public static final int APK_ProgressDialog = 4;
    
    	public static final String APK_DOLOAD_FILEPATH = Environment.getExternalStorageDirectory().getAbsolutePath()
    			+ "/Lxz.apk";
    
    	private String url;
    	private String filePath;
    	private String fileMd5;
    	private Handler mHandler;
    
    	public ApkDownloader(String url, String saveFilePath, String fileMd5, Handler handler) {
    		this.url = url;
    		this.filePath = saveFilePath;
    		this.fileMd5 = fileMd5;
    		this.mHandler = handler;
    	}
    
    	@Override
    	public void run() {
    		try {
    			DefaultHttpClient httpClient = new DefaultHttpClient();
    			HttpGet httpGet = new HttpGet(url);
    			HttpResponse response = httpClient.execute(httpGet);
    
    			if (response.getStatusLine().getStatusCode() == 200) {
    				HttpEntity entity = response.getEntity();
    				long size = entity.getContentLength();
    				if (entity.isStreaming()) {
    					InputStream is = entity.getContent();
    					FileOutputStream fos = new FileOutputStream(filePath);
    					byte[] buffer = new byte[1024 * 1024];
    					int len = 0;
    					int downSize = 0;
    					while ((len = is.read(buffer)) > 0) {
    						fos.write(buffer, 0, len);
    						downSize += len;
    						Message message = mHandler.obtainMessage();
    						message.what = APK_DOWNLOAD_PROGRESS;
    						message.getData().putInt(APK_DOWNLOAD_PROGRESS_EXTRA, (int) (downSize * 100 / size));
    						mHandler.sendMessage(message);
    					}
    
    					fos.flush();
    					is.close();
    					fos.close();
    
    					String md5 = FileUtils.getFileMd5(filePath);
    					if (TextUtils.isEmpty(md5)) {
    						Message message = mHandler.obtainMessage();
    						message.what = APK_DOWNLOAD_FAIL;
    						message.getData().putString(APK_DOWNLOAD_FAIL_EXTRA, "服务器返回md5=null");
    						mHandler.sendMessage(message);
    					} else if (!md5.equals(fileMd5)) {
    						Message message = mHandler.obtainMessage();
    						message.what = APK_DOWNLOAD_FAIL;
    						message.getData().putString(APK_DOWNLOAD_FAIL_EXTRA, "服务器返回md5与下载apk的md5不符...");
    						mHandler.sendMessage(message);
    					} else {
    						mHandler.sendEmptyMessage(APK_DOWNLOAD_SUCESS);
    					}
    				}
    			}
    		} catch (Exception e) {
    			Message message = mHandler.obtainMessage();
    			message.what = APK_DOWNLOAD_FAIL;
    			message.getData().putString(APK_DOWNLOAD_FAIL_EXTRA, "网络异常,请到关于界面重新上级...");
    			mHandler.sendMessage(message);
    		}
    	}
    
    }



    handler处理器

     Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case ApkDownloader.APK_DOWNLOAD_FAIL:
                        progressDialog.dismiss();
                        String errorMsg = msg.getData().getString(ApkDownloader.APK_DOWNLOAD_FAIL_EXTRA);
                        Toast.makeText(About_application.this, errorMsg, Toast.LENGTH_SHORT).show();
                        break;
                    case ApkDownloader.APK_DOWNLOAD_PROGRESS:
    
                        int lenght = msg.getData().getInt(ApkDownloader.APK_DOWNLOAD_PROGRESS_EXTRA);
                        progressDialog.setProgress(lenght);
                        break;
                    case ApkDownloader.APK_DOWNLOAD_SUCESS:
                        progressDialog.dismiss();
                        installApk(ApkDownloader.APK_DOLOAD_FILEPATH);
                        Log.i("下载文件路径", ApkDownloader.APK_DOLOAD_FILEPATH);
                        break;
    
                    case ApkDownloader.APK_NEW_VERSION:
                        progressDialog = new ProgressDialog(About_application.this);
                        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        progressDialog.setMessage("正在下载新版本...");
                        progressDialog.setIndeterminate(false);
                        progressDialog.setCancelable(false);
                        progressDialog.setCanceledOnTouchOutside(false);
                        progressDialog.show();
                        ApkDownloader apkDownloader = new ApkDownloader(apkDownUrl, ApkDownloader.APK_DOLOAD_FILEPATH, apkMD5,
                                handler);
                        apkDownloader.start();
                        break;
                    default:
                        break;
                }
            }
        };
    
        private void installApk(String filepath) {
            File file = new File(filepath);
            if (!file.exists()) {
                Log.i("找不到文件", "------------软件安装之更新版本------------");
                return;
            }
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
            this.startActivity(intent);
    
        }



    结合接口,实现更新

      @Override
                public void setPost(JSONObject object, ProgressDialog progressDialog) {
                    Log.i("版本升级", object.toJSONString());
                    progressDialog.dismiss();
                    if (!object.getBoolean("islatest")) {
                        apkDownUrl = "http://192.168.25.232:8021/" + object.getString("url");
                        apkMD5 = object.getString("md5");
                        handler.sendEmptyMessage(ApkDownloader.APK_NEW_VERSION);
                    } else {
                        Toast.makeText(About_application.this, "当前最新版本", Toast.LENGTH_SHORT).show();
                    }
                }








    展开全文
  • Android开发中APK升级的两种思路

    千次阅读 2015-12-24 13:21:53
     项目的第一版已经成型,要结束了,还差为了后期准备升级的功能没有实现,也就是apk升级,这种需求非常常见,今天上网查了一些资料,听项目经理给我介绍了两种常见的apk升级的思路,总结一下:   一、在服务器端...
  • android 系统升级apk

    2018-11-09 17:52:49
    android 系统升级apk
  • 手机OTA升级是指Android系统提供的标准软件升级方式,可以无损失升级系统,主要手段是通过网络(包括WIFI、3G)自动下载OTA升级包、自动升级,不局限,也支持通过下载OTA升级包到SD卡升级. 手机OTA升级以补丁方式的...
  • 版本号自定义软件是一款可以帮助用户修改应用版本号的插件,可以修改apk版本号为自己想要的版本哟,需要的朋友赶紧来下载吧。 应用说明 这是一款可以修改任意软件版本号的模块! 可以用来禁止弹出更新提示框! 注意...
  • 自动检测升级 是否开启 二.查找系统内apk文件 按钮 三.下载系统安装包 按钮 四. 立即下载 按钮 五. 背景下载静默安装 按钮 背景下载静默安装有相应代码,未启用,本人技术尚浅,有相应功能要做的亲可借鉴相关代码,...
  • 电信设备-一种基于移动终端的强相关apk升级方法及系统.zip
  • apk升级

    千次阅读 2013-04-16 14:01:21
    apk本地升级,可以直接调用系统的升级程序: Uri uri = Uri.fromFile( new File(fileName,apkname)); Intent intent = new Intent(Intent. ACTION_VIEW ); intent.setDataAndType(uri, "application/vnd....
  • 其实要实现Android发布新版本的APK升级是一个简单的事情,只要你明白其中的道理和实现方法就能很快实现出来,废话不多说,下面我给大家简单介绍一下实现步骤: 1:要知道APK是否有升级更新就需要知道本地的app...
  • android应用apk升级更新

    千次阅读 2018-08-16 11:25:46
    File ApkFile = new File(apkFile); FileOutputStream fos = new FileOutputStream(ApkFile); int count = 0; byte buf[] = new byte[1024]; do { int numread = is.read(buf); count += numread; progress ...
  • unity 内部更新Apk 自动安装 支持安卓8.0 以上 demo.apk 测试包
  • Android版本更新(检测、升级),检测版本,通过apk路径下载安装包,并进度条展示,安装
  • Android 自动安装apk

    2018-05-19 16:22:06
    android 自动安装apk的demo,可根据自己的需求进行修改。
  • 将新版本的apk以及新版本apk的版本信息文件放到服务器目录下,一般是系统盘目录下C:\inetpub\wwwroot文件夹中。 放置两个文件,一个是新版本的apk文件,一个是version_configuration.xml版本信息文件,用于获取...
  • apk 升级

    2012-08-25 21:14:43
    本身内置不可卸载第三方apk,用户再安装新版本后,关机出现新安装的丢失现象。经过查看log,发现第三方versioncode版本没有升级,只是修改了versionname版本名字,必须更新versioncode才能更新版本。
  • NULL 博文链接:https://xiekellen.iteye.com/blog/2101424
  • 【Android】轻松实现 APK 在线升级

    千次阅读 2019-01-12 11:25:48
    【Android】轻松实现 APK 在线升级 APK 在线升级 APK 在线升级几乎是所有程序必备的功能。 在线升级功能能解决已有的问题并提供更丰富的新功能。 基本的流程是: 检测到新版本信息 弹出升级提示窗口 点击 No 不...
  • 注意:无特殊说明,Flutter版本及Dart版本如下: ...Android平台,既可以通过跳转到应用市场进行升级,也可以下载apk升级。 从强制性来说可以分别强制升级和非强制升级: 强制升级:就是用户必须升级
  • 安卓系统签名apk静默升级方法

    千次阅读 2019-04-29 10:42:49
    实现静默安装首先手机就...下面是实现静默升级的步骤: 1、在AndroidManifest文件中添加权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" /...
  • android apk 在线升级原型
  • 升级apk和更新安装apk的整理

    千次阅读 2018-01-31 16:51:05
    自己学习和总结的关于app的升级和安装 就是我们在splash页面(自己随意)先获取自己的版本VersionCode我们在获取服务端的一个json,获取里面的serverVersionCode,比较这两个值,ServerVersionCode > versionCode 进行...
  • 升级apk流程:从服务器下载更新的apk----对apk做校验----安装apk 本文讲一下对apk做签名文件校验,实际上就是获取本机已安装apk的签名和从服务器下载的apk的签名,计算两个签名文件的MD5,如果MD5一样,就说明签名...
  • 说明:Android APP的版本可以在...主要用于版本升级,是INT类型的,第一个版本定义为1,以后递增,这样只要判断该值就能确定是否需要升级,该值不显示给用户。 android:versionName 这个是说明的版本号,
  • 【问题】:Android APP实现升级apk安装时,会出现这样的错误:android.os.FileUriExposedException: xxx.apk exposed beyond app through Intent.getData()。 【原实现代码】: private void installAPK() { ...
  • apkFile = new File(updateDir.getPath(), "townnet.apk"); if (apkFile.exists()) { apkFile.delete(); } // 修改文件夹及安装包的权限,供第三方应用访问 try { Runtime.getRuntime().exec( "chmod 705 " +...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,655
精华内容 14,262
关键字:

apk升级