SystemAPP 静默安装

该文章详细介绍了如何在Android中创建一个BroadcastReceiver监听安装包的状态,包括注册InstallResultReceiver来接收安装反馈,以及实现静默安装Apk的步骤,如使用PackageManager的PackageInstaller进行安装,并通过SessionCallback跟踪安装进度和结果。
注册监听

<receiver
    android:name="InstallResultReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.content.pm.extra.STATUS"/>
    </intent-filter>

</receiver>

public class InstallResultReceiver extends BroadcastReceiver {
    public final String TAG = "carden" + InstallResultReceiver.class.getSimpleName();

    public InstallResultReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "收到安装反馈广播了");
        if (intent != null) {
            final int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS,
                    PackageInstaller.STATUS_FAILURE);
            Log.d(TAG, "收到安装反馈广播了--"+status);
            if (status == PackageInstaller.STATUS_SUCCESS) {
                // success
                int requestCode=intent.getIntExtra("flag",0);
                if (requestCode==1){
                    Log.d(TAG,"静默安装成功");
                }else if (requestCode==2){
                    Log.d(TAG,"静默卸载成功");
                }
                Log.d(TAG, "APP Install Success!");
            } else {
                String msg = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);
                Log.e(TAG, "Install FAILURE status_massage" + msg);
            }
        }

    }
}

2,安装,路径根据自己授权动态填写,我是写死的




private void silentInstallApk(Context context,String apkFilePath, String apkName) {
    File apkFile = new File(apkFilePath);
    long apkFileLength = apkFile.length();
    PackageManager pm = context.getPackageManager();
    PackageInstaller packageInstaller = pm.getPackageInstaller();
    packageInstaller.registerSessionCallback(new PackageInstaller.SessionCallback() {
        @Override
        public void onCreated(int sessionId) {
            Log.e(TAG, "Install Start sessionId-> " + sessionId);
        }
        @Override
        public void onBadgingChanged(int sessionId) {}

        @Override
        public void onActiveChanged(int sessionId, boolean active) {}

        @Override
        public void onProgressChanged(int sessionId, float progress) {}

        @Override
        public void onFinished(int sessionId, boolean success) {
            if (success) {
                Log.e(TAG, "Silent Install Success");
            } else {
                Log.e(TAG, "Silent Install Fail");
            }
        }
    });

    int count;
    int sessionId;
    byte[] buffer = new byte[1024*1024];

    InputStream inputStream;
    OutputStream outputStream;
    PackageInstaller.Session session = null;
    PackageInstaller.SessionParams sessionParams;

    try {
        sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        sessionId =  packageInstaller.createSession(sessionParams);
        session = packageInstaller.openSession(sessionId);
        Log.e(TAG, "Install Start sessionId-> " + sessionId);
        inputStream = new FileInputStream(apkFile);
        outputStream = session.openWrite("base.apk", 0, apkFileLength);

        while((count = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, count);
            float progress = ((float)count / (float)apkFileLength);
            session.setStagingProgress(progress);
        }
        session.fsync(outputStream);

        inputStream.close();
        outputStream.flush();
        outputStream.close();

        Intent intent = new Intent(this, InstallResultReceiver.class);
        intent.putExtra("flag", 1);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this,
                1, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        session.commit(pendingIntent.getIntentSender());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

int mSessionId =-1;

public String installApp(String apkFilePath) {
    String success = "fail";
    Log.d(TAG, "installApp()------->" + apkFilePath);
    File apkFile = new File(apkFilePath);
    if (!apkFile.exists()) {
        Log.d(TAG, "文件不存在");

    }

    PackageInfo packageInfo = getPackageManager().getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);
    if (packageInfo != null) {
        String packageName = packageInfo.packageName;
        int versionCode = packageInfo.versionCode;
        String versionName = packageInfo.versionName;
        Log.d("ApkActivity", "packageName=" + packageName + ", versionCode=" + versionCode + ", versionName=" + versionName);
    }

    PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
    PackageInstaller.SessionParams sessionParams
            = new PackageInstaller.SessionParams(PackageInstaller
            .SessionParams.MODE_FULL_INSTALL);
    Log.d(TAG, "apkFile length" + apkFile.length());
    sessionParams.setSize(apkFile.length());

    try {
        mSessionId = packageInstaller.createSession(sessionParams);
    } catch (IOException e) {
        e.printStackTrace();
    }

    Log.d(TAG, "sessionId---->" + mSessionId);
    if (mSessionId != -1) {
        boolean copySuccess = onTransfesApkFile(apkFilePath);
        Log.d(TAG, "copySuccess---->" + copySuccess);
        if (copySuccess) {
            boolean isSuccess = execInstallAPP();
            success = isSuccess ? "Success" : "fail";
            Log.d(TAG, "静默成功---" + isSuccess);
        }

    }
    return success;
}
private boolean onTransfesApkFile(String apkFilePath) {
    Log.d(TAG, "---------->onTransfesApkFile()<---------------------");
    InputStream in = null;
    OutputStream out = null;
    PackageInstaller.Session session = null;
    boolean success = false;
    try {
        File apkFile = new File(apkFilePath);
        session = getPackageManager().getPackageInstaller().openSession(mSessionId);
        out = session.openWrite("base.apk", 0, apkFile.length());
        in = new FileInputStream(apkFile);
        int total = 0, c;
        byte[] buffer = new byte[1024 * 1024];
        while ((c = in.read(buffer)) != -1) {
            total += c;
            out.write(buffer, 0, c);
        }
        session.fsync(out);
        Log.d(TAG, "streamed " + total + " bytes");
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (null != session) {
            session.close();
        }
        try {
            if (null != out) {
                out.close();
            }
            if (null != in) {
                in.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return success;
}


private boolean execInstallAPP() {
    Log.d(TAG, "--------------------->execInstallAPP()<------------------");
    PackageInstaller.Session session = null;
    try {
        session = getPackageManager().getPackageInstaller().openSession(mSessionId);
        Intent intent = new Intent(this, InstallResultReceiver.class);
        intent.putExtra("flag", 1);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this,
                1, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        session.commit(pendingIntent.getIntentSender());
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    } finally {
        if (null != session) {
            session.close();
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值