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

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中添加

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

(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 /system/app/ 命令实现安装,即可拥有系统权限。

静默卸载:

    public static Process uninstallApp(String packageName) {
        Process p = execRuntimeProcess("pm uninstall " + packageName);
        if (p == null) {
            Log.e("input", "Uninstall app packageName:" + packageName + ", FAILED !");
        } else {
            Log.e("input", "Uninstall app packageName:" + packageName + ", SUCCESS !");
        }
        return p;
    }
    public static Process execRuntimeProcess(String commond) {
        Process p = null;
        try {
            p = Runtime.getRuntime().exec(commond);
        } catch (IOException e) {
            Log.e("input", "exec Runtime commond:" + commond + ", IOException" + e);
            e.printStackTrace();
        }
        return p;
    }

results matching ""

    No results matching ""