android中从代码上看安装程序之普通安装和静默安装

   在 Android开发中,我们经常需要对自己的APP进行自动升级安装,今天我们就来讲一讲安装程序的代码怎么写,android中,安装程序的方式分为普通安装和静默安装,普通安装是通过调用Intent来发送一个 "application/vnd.android.package-archive"给系统,然后系统调用自身的安装程序来帮助你来完成程序的安装工作。静默安装时通过调用系统命令 pm来完成的。

        首先来看一下普通安装的代码,这个代码是一般情况下是这样子的:

    public static boolean installNormal(Context context, String filePath) {  
            Intent i = new Intent(Intent.ACTION_VIEW);  
            File file = new File(filePath);  
            if (file == null || !file.exists() || !file.isFile()  
                    || file.length() <= 0) {  
                return false;  
            }  
      
            i.setDataAndType(Uri.parse("file://" + filePath),  
                    "application/vnd.android.package-archive");  
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
            context.startActivity(i);  
            return true;  
        }  

        下面在来看看静默安装的程序是怎么实现的。

    public static int installSilent(Context context, String filePath,  
                String pmParams) {  
            if (filePath == null || filePath.length() == 0) {  
                return INSTALL_FAILED_INVALID_URI;  
            }  
      
            File file = new File(filePath);  
            if (file == null || file.length() <= 0 || !file.exists()  
                    || !file.isFile()) {  
                return INSTALL_FAILED_INVALID_URI;  
            }  
      
            /** 
             * if context is system app, don't need root permission, but should add 
             * <uses-permission android:name="android.permission.INSTALL_PACKAGES" 
             * /> in mainfest 
             **/  
            StringBuilder command = new StringBuilder()  
                    .append("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install ")  
                    .append(pmParams == null ? "" : pmParams).append(" ")  
                    .append(filePath.replace(" ", "\\ "));  
            CommandResult commandResult = ShellUtils.execCommand(  
                    command.toString(), !isSystemApplication(context), true);  
            if (commandResult.successMsg != null  
                    && (commandResult.successMsg.contains("Success") || commandResult.successMsg  
                            .contains("success"))) {  
                Log.d("PackageUtils", "install system app ok!");  
                return INSTALL_SUCCEEDED;  
            }  
    }  

        静默安装时,一般情况下需要获取系统权限,查看是否是系统APP或具有系统权限的代码如下:

    public static boolean isSystemApplication(PackageManager packageManager,  
                String packageName) {  
            if (packageManager == null || packageName == null  
                    || packageName.length() == 0) {  
                return false;  
            }  
      
            try {  
                ApplicationInfo app = packageManager.getApplicationInfo(  
                        packageName, 0);  
                return (app != null && (app.flags & ApplicationInfo.FLAG_SYSTEM) > 0);  
            } catch (NameNotFoundException e) {  
                e.printStackTrace();  
            }  
        return false;  
    }  

查看是否具有系统权限

    public static boolean checkRootPermission() {  
            return execCommand("echo root", true, false).result == 0;  
        }  
    public static CommandResult execCommand(String[] commands, boolean isRoot,  
                boolean isNeedResultMsg) {  
            int result = -1;  
            if (commands == null || commands.length == 0) {  
                return new CommandResult(result, null, null);  
            }  
      
            Process process = null;  
            BufferedReader successResult = null;  
            BufferedReader errorResult = null;  
            StringBuilder successMsg = null;  
            StringBuilder errorMsg = null;  
      
            DataOutputStream os = null;  
            try {  
                process = Runtime.getRuntime().exec(  
                        isRoot ? COMMAND_SU : COMMAND_SH);  
                os = new DataOutputStream(process.getOutputStream());  
                for (String command : commands) {  
                    if (command == null) {  
                        continue;  
                    }  
      
                    // donnot use os.writeBytes(commmand), avoid chinese charset  
                    // error  
                    os.write(command.getBytes());  
                    os.writeBytes(COMMAND_LINE_END);  
                    os.flush();  
                }  
                os.writeBytes(COMMAND_EXIT);  
                os.flush();  
      
                result = process.waitFor();  
                // get command result  
                if (isNeedResultMsg) {  
                    successMsg = new StringBuilder();  
                    errorMsg = new StringBuilder();  
                    successResult = new BufferedReader(new InputStreamReader(  
                            process.getInputStream()));  
                    errorResult = new BufferedReader(new InputStreamReader(  
                            process.getErrorStream()));  
                    String s;  
                    while ((s = successResult.readLine()) != null) {  
                        successMsg.append(s);  
                    }  
                    while ((s = errorResult.readLine()) != null) {  
                        errorMsg.append(s);  
                    }  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    if (os != null) {  
                        os.close();  
                    }  
                    if (successResult != null) {  
                        successResult.close();  
                    }  
                    if (errorResult != null) {  
                        errorResult.close();  
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
      
                if (process != null) {  
                    process.destroy();  
                }  
            }  
            return new CommandResult(result, successMsg == null ? null  
                    : successMsg.toString(), errorMsg == null ? null  
                    : errorMsg.toString());  
        }  

安装时调用如下:

    public static final int install(Context context, String filePath) {  
            if (isSystemApplication(context,filePath)  
                    || checkRootPermission()) {  
                return installSilent(context, filePath);  
            }  
            return installNormal(context, filePath) ? INSTALL_SUCCEEDED  
                    : INSTALL_FAILED_INVALID_URI;  
        }  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统的功能模块主要是实现管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值