Android 中静默安装

静默安装原理:

    1.需要获取root的操作权限

    2.通过命令式的方式直接进行安装APK。在使用 Android Studio debug安装的时候可以看到控制台上的命令

    

那么就直接上代码吧:

/**<p>项目名:singno</p>
 * <p>包名:	com.singno</p>
 * <p>文件名:VersionManager.java</p>
 * <p>版本信息: 2.1.0</p>
 * <p>日期: 2015/4/30/16:28.</p>
 * Copyright (c) 2015singno-版权所有
 */
package com.singno;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.util.Log;

import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

/**
 * <p>名称:com.singno.VersionManager</p>
 * <p>描述:</p>
 * <pre>
 *  APK版本管理器
 *  版本检查,版本更新等
 * </pre>
 *
 * @author 鲍建明
 * @version 2.1.0
 * @date 2015/4/30/16:28
 */
public class VersionManager {

    private static final String TAG = VersionManager.class.getName();

    private Context context;

    public VersionManager(Context context){
        this.context = context;
    }


    /**
     * 检查版本号是否相同
     * @param versionCode
     * @return
     */
    public boolean isSameVersion(int versionCode){
        return getCurrentVersion() != versionCode ? Boolean.FALSE : Boolean.TRUE;
    }

    /**
     * 静默安装,安装之前必须要获取到ROOT权限
     * 原理:1.先获取到ROOT权限
     *  2.在通过命令的方式直接安装APK
     * @return
     */
    public boolean silenceInstall(File file){
        Process process = null;
        OutputStream out = null;
        DataOutputStream dataOutputStream = null;
        try {
            process = Runtime.getRuntime().exec("su");
            out = process.getOutputStream();
            dataOutputStream = new DataOutputStream(out);
            dataOutputStream.writeBytes("chmod 777 " + file.getPath() + "\n");
            dataOutputStream.writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r " + file.getPath());
            // 提交命令
            dataOutputStream.flush();
            int value = process.waitFor();
            if( value == 0){
                return Boolean.TRUE;
            }
            return Boolean.FALSE;

        } catch (Exception e) {
            e.printStackTrace();
            return Boolean.FALSE;
        }finally{
            try {
                if( dataOutputStream != null ){
                    dataOutputStream.close();
                }
                if( out != null ){
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 普通的安装应用方式
     * @param file  安装包文件
     */
    public void installApk(File file){
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setDataAndType(Uri.parse("file://" + file.toString()), "application/vnd.android.package-archive");
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        this.context.startActivity(i);
    }

    /**
     * 获取服务端中的版本号
     * 这个自行完成
     * @return
     */
    public int getHttpVersion(){
        return 0;
    }


    /**
     * 获取当前APK的版本号
     * @return 当前APK的版本号
     */
    public int getCurrentVersion(){
        try {
            return this.context.getPackageManager().getPackageInfo(this.context.getPackageName(), 0).versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            Log.e(TAG, "获取版本号失败");
            return 0;
        }
    }


    /**
     * 下载APK
     */
    public void downApk(){
        new Thread(new DownApk()).start();
    }

    /**
     * 显示下载进度提示框
     */
    private void showDownloadDialog(){

    }

    /**
     * 显示软件更新提示对话框
     */
    private void showNoticeDialog(){

    }


    /**
     * 下载APk的类
     */
    class DownApk implements Runnable{

        @Override
        public void run() {

        }
    }

}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。