android 静默安装之后自启动

先说一下实现逻辑,首先手机必须root权限,然后静默安装apk,在通过广播的形式启动安装的apk。

手机必须root权限 手机必须root权限 手机必须root权限 手机必须root权限

静默安装方法,返回值是0代表成功,1失败,其他不知
方法一:

//cmd =apk存储路径
protected int excuteSuCMD(String cmd) {
PrintWriter PrintWriter = null;
        Process process = null;
        try {
            process = Runtime.getRuntime().exec("su");
            PrintWriter = new PrintWriter(process.getOutputStream());
            PrintWriter.println("chmod 777 " + cmd);
            PrintWriter
                    .println("export LD_LIBRARY_PATH=/vendor/lib:/system/lib");
            PrintWriter.println("pm install -r " + cmd);
            // PrintWriter.println("exit");
            PrintWriter.flush();
            PrintWriter.close();
            int value = process.waitFor();
            Log.e("File.toString()====value=静默安装返回值===", "" + value);
            return (Integer)value;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } finally {
            if (process != null) {
                process.destroy();
            }
        }
        }

方法二:

//cmd ="pm install -r "+apk存储路径
protected int excuteSuCMD(String cmd) {
        try {
            //手机必须root
            Process process = Runtime.getRuntime().exec("su");// (这里执行是系统已经开放了root权限,而不是说通过执行这句来获得root权限)
            DataOutputStream dos = new DataOutputStream(
                    (OutputStream) process.getOutputStream());
            // 部分手机Root之后Library path 丢失,导入path可解决该问题
            dos.writeBytes((String) "export LD_LIBRARY_PATH=/vendor/lib:/system/lib\n");
            cmd = String.valueOf(cmd);
            dos.writeBytes((String) (cmd + "\n"));
            dos.flush();
            dos.writeBytes("exit\n");
            dos.flush();
            process.waitFor();
            int result = process.exitValue();
            System.out.println("静默安装命令1:" + result);
            return (Integer) result;
        } catch (Exception localException) {
            localException.printStackTrace();
            return -1;
        }
        }

静默安装成功之后,当前程序会自动退出,如果需要在自启动,必须借助广播。
注意:小编在这遇到一个问题,静默安装要都是debug版本,或者release版本,不能混淆

广播通知:
在androidManifest.xml中注册广播

<receiver android:name=".UpdateReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REPLACED"/>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
public class UpdateReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        if (intent.getAction().equals("android.intent.action.PACKAGE_REPLACED")){
            Toast.makeText(context,"升级了一个安装包,重新启动此程序", Toast.LENGTH_SHORT).show();

            Intent intent2 = new Intent(context, SplashActivity.class);
            intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent2);

        }
        //接收安装广播
        if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {
            String packageName = intent.getDataString();
            System.out.println("安装了:" +packageName + "包名的程序");
        }
        //接收卸载广播
        if (intent.getAction().equals("android.intent.action.PACKAGE_REMOVED")) {
            String packageName = intent.getDataString();
            System.out.println("卸载了:"  + packageName + "包名的程序");

        }

    }
}

注:PACKAGE_REPLACED—-替换apk
PACKAGE_ADDED—添加apk
PACKAGE_REMOVED–删除apk
一般添加,删除apk中,广播基本不会实现

参考文章为:http://blog.csdn.net/qq_29716061/article/details/51602173
http://blog.csdn.net/wan_ing/article/details/53407748

猜你喜欢

转载自blog.csdn.net/tjj93622/article/details/54964382