Android 中静默安装实现

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

静默安装原理:

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

    2.通过命令式的方式直接进行安装APK。在使用 Android Studio debug安装的时候可以看到控制台上的命令
 
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() {
 
        }
    }
 
}

标签: 权限

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:iOS从背景图中取色的代码

下一篇:关键字检索高亮标出-javasript/jQuery代码实现