Android_如何静默安装

Android常用代码之普通及系统权限静默安装APK

本文主要介绍程序如何安装apk,包括普通模式安装和系统权限静默安装。

如果是非系统应用请直接查看:Android常用代码之APK root权限静默安装,查看更完美的解决方案。

 

1、普通模式安装,调用系统Intent,代码如下:

public static void install(Context context, String filePath) {

    Intent i = new Intent(Intent.ACTION_VIEW);

    i.setDataAndType(Uri.parse("file://" + filePath), "application/vnd.android.package-archive");

    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    context.startActivity(i);

}

2、静默安装

如果是非系统应用请移步:Android常用代码之APK root权限静默安装,查看更完美的解决方案。

分为如下三步

(1)、静默安装需要系统应用安装权限,需要在AndroidManifest.xml中添加

Java


1

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

 记得clear啊 一般会出错提示。

(2)、实现代码

静默安装代码如下,实际是通过pm install -r 命令安装。

注意:该函数最好在新建的线程中运行并通过handler发送安装结果给主线程,否则安装时间较长会导致ANR。

/**

 * install slient

 * 

 * @param context

 * @param filePath

 * @return 0 means normal, 1 means file not exist, 2 means other exception error

 */

public static int installSlient(Context context, String filePath) {

    File file = new File(filePath);

    if (filePath == null || filePath.length() == 0 || (file = new File(filePath)) == null || file.length() <= 0

        || !file.exists() || !file.isFile()) {

        return 1;

    }

 

    String[] args = { "pm", "install", "-r", filePath };

    ProcessBuilder processBuilder = new ProcessBuilder(args);

 

    Process process = null;

    BufferedReader successResult = null;

    BufferedReader errorResult = null;

    StringBuilder successMsg = new StringBuilder();

    StringBuilder errorMsg = new StringBuilder();

    int result;

    try {

        process = processBuilder.start();

        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();

        result = 2;

    } catch (Exception e) {

        e.printStackTrace();

        result = 2;

    } finally {

        try {

            if (successResult != null) {

                successResult.close();

            }

            if (errorResult != null) {

                errorResult.close();

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

        if (process != null) {

            process.destroy();

        }

    }

 

    // TODO should add memory is not enough here

    if (successMsg.toString().contains("Success") || successMsg.toString().contains("success")) {

        result = 0;

    } else {

        result = 2;

    }

    Log.d("installSlient", "successMsg:" + successMsg + ", ErrorMsg:" + errorMsg);

    return result;

}

返回值0表示安装成功,1表示文件不存在,2表示其他错误。需要更丰富的安装失败信息(内存不足、解析包出错)可直接使用PackageUtils.installSlient。

 

(3) 、获取系统权限

完成了上面两步后,普通方式安装我们的应用仍然无法静默安装。需要我们的应用获得系统权限,编译应用并通过

adb push <your_apk_path> /system/app/

命令实现安装,即可拥有系统权限。


你可能感兴趣的:(android,静默安装)