Android静默安装(需root)

最近小编在做一个静默安装的功能,静默安装的解决方式有许多种,小编今天就讲解一下我所做的这种方式,前提:需要Root(比较适合android定制开发板)

静默安装

静默安装的意思就是不通过android系统的安装提示页面进行app的安装。

如果我们的app在升级的时候,不想看到安卓系统自带的安装界面,我们可以使用静默安装。
那么:现在开始—

至于安装过程中的断点下载,获取文件这里就不做一一讲解了,这个相信大家都会。

来不及解释了,直接贴代码吧:

 /**
     * 执行具体的静默安装逻辑,需要手机ROOT。
     * @param apkPath
     *          要安装的apk文件的路径
     * @return 安装成功返回true,安装失败返回false。
     */
    private static boolean install(String apkPath) {
        boolean result = false;
            DataOutputStream dataOutputStream = null;
            BufferedReader errorStream = null;
            try {
                // 申请su权限
                Process process = Runtime.getRuntime().exec("su");
                    dataOutputStream = new DataOutputStream(process.getOutputStream());
                    //执行卸载命令
                    String command1 = "pm uninstall "+ mContext.getPackageName() +" \n";
                    dataOutputStream.write(command1.getBytes(Charset.forName("utf-8")));
                    dataOutputStream.flush();
                    // 执行pm install命令
                    //这种方式是先卸载再安装,不是覆盖安装,收取不到apk的签名不一致等等信息,
                    //可以把 "pm install " + apkPath + "\n";换成"pm install -rf " + apkPath + "\n" 也不用执行上面的卸载命令
                    String command2 = "pm install " + apkPath + "\n";
                    dataOutputStream.write(command2.getBytes(Charset.forName("utf-8")));

                    dataOutputStream.flush();
                    dataOutputStream.writeBytes("exit\n");
                    dataOutputStream.flush();
                    process.waitFor();
                    errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                    String msg = "";
                    String line;
                    // 读取命令的执行结果
                    while ((line = errorStream.readLine()) != null) {
                        msg += line;
                    }
                    Log.d("TAG", "install msg is " + msg);
                    // 如果执行结果中包含Failure字样就认为是安装失败,否则就认为安装成功
                    if (!msg.contains("Failure")) {
                        result = true;
                    }
            } catch (Exception e) {
                Log.e("TAG", e.getMessage(), e);
            } finally {
                try {
                    if (dataOutputStream != null) {
                        dataOutputStream.close();
                    }
                    if (errorStream != null) {
                        errorStream.close();
                    }
                } catch (IOException e) {
                    Log.e("TAG", e.getMessage(), e);
                }
            }

        return result;
    }
安装玩之后,如果你的app不是Launcher程序,或者你的安卓系统中存在多个Launcher程序,如果你想再app安装完之后自启动你的app,可以使用广播实现:
<!-- 清单文件里面注册你的广播 -->
<receiver android:name=".broadcastreceiver.YouUpgradeApk"
    >
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED"/>
        <data android:scheme="package"/>
    </intent-filter>

</receiver>

广播实现类

if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){
       Toast.makeText(context,"升级了一个安装包",Toast.LENGTH_SHORT).show();
    //跳转到你想跳转的页面
       Intent intent2 = new Intent(context, StartUpActivity.class);
       //设置标志位
       intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       context.startActivity(intent2);
   }

清单文件权限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name= "android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" tools:ignore="ProtectedPermissions" />
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值