apk静默升级,适用于高版本的android系统

这段代码展示了如何在Android 9.0 (Pie) 中使用PackageInstaller API进行应用安装。首先注册BroadcastReceiver监听安装事件,然后创建安装会话并拷贝APK文件到会话中,最后执行安装命令。整个过程涵盖了从初始化安装参数、创建会话、拷贝文件到执行安装的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,直接上代码,如下

 

package com.tianci.utils;

import android.annotation.TargetApi;

import android.app.PendingIntent;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.content.pm.PackageInfo;

import android.content.pm.PackageInstaller;

import android.content.pm.PackageManager;

import android.os.Build;

import android.util.Log;

 

import com.tianci.apkinstaller.AppCoreInstaller;

 

import java.io.Closeable;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

 

public class AppInstall28Util {

 

private static final String TAG = "Media";//AppInstall28Util.class.getSimpleName();

private static Context mContext;

private static AppCoreInstaller.InstallerListener mListener;

// 适配android9的安装方法。

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

public static void install28(Context context, final String apkFilePath, PackageManager packageManager, AppCoreInstaller.InstallerListener listener) {

MediaLogUtils.d("--->>>install28()--->>> apkFilePath:"+apkFilePath);

mListener = listener;

mContext = context;

registerAndroidPackageReceiver(context);

 

File apkFile = new File(apkFilePath);

PackageInstaller packageInstaller = packageManager.getPackageInstaller();

PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);

sessionParams.setSize(apkFile.length());

packageInstaller.registerSessionCallback(new PackageInstaller.SessionCallback() {

@Override

public void onCreated(int sessionId) {

MediaLogUtils.d("--->>>onCreated()--->>> sessionId:"+sessionId);

}

 

@Override

public void onBadgingChanged(int sessionId) {

 

MediaLogUtils.d("--->>>onBadgingChanged()--->>> sessionId:"+sessionId);

}

 

@Override

public void onActiveChanged(int sessionId, boolean active) {

 

MediaLogUtils.d("--->>>onActiveChanged()--->>> sessionId:"+sessionId+",active:"+active);

}

 

@Override

public void onProgressChanged(int sessionId, float progress) {

MediaLogUtils.d("--->>>onProgressChanged()--->>> sessionId:"+sessionId+",progress:"+progress);

}

 

@Override

public void onFinished(int sessionId, boolean success) {

MediaLogUtils.d("--->>>onFinished()--->>> sessionId:"+sessionId+",success: "+success);

if (mListener!=null)

{

PackageInfo pkgInfo = null;

try {

PackageManager pm = mContext.getPackageManager();

pkgInfo = pm.getPackageArchiveInfo(apkFilePath, PackageManager.GET_ACTIVITIES);

} catch (Exception e) {

e.printStackTrace();

}

String message = null;

AppCoreInstaller.INSTALL_RESULT result;

if (success)

{

message = "install apk success !!!";

result = AppCoreInstaller.INSTALL_RESULT.SUCCESS;

}else

{

message = "install apk fail !!!";

result = AppCoreInstaller.INSTALL_RESULT.FAILED_UNKNOW;

}

//mListener.onInstallEnd(apkFilePath, result, pkgInfo.packageName, message);

if (mContext!=null)

{

Utils.showToast(mContext, message);

}

}

}

});

 

int sessionId = createSession(packageInstaller, sessionParams);

if (sessionId != -1) {

boolean copySuccess = copyInstallFile(packageInstaller, sessionId, apkFilePath);

MediaLogUtils.d("--->>>install28()--->>> copy Success apkFilePath:"+apkFilePath);

if (copySuccess) {

execInstallCommand(context, packageInstaller, sessionId);

}

}

}

 

private static void registerAndroidPackageReceiver(Context context) {

 

IntentFilter installFilter = new IntentFilter();

installFilter.addAction(PackageInstaller.EXTRA_STATUS);

InstallResultReceiver installResultReceiver = new InstallResultReceiver();

context.registerReceiver(installResultReceiver, installFilter);

}

 

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private static int createSession(PackageInstaller packageInstaller,

PackageInstaller.SessionParams sessionParams) {

int sessionId = -1;

try {

sessionId = packageInstaller.createSession(sessionParams);

} catch (IOException e) {

e.printStackTrace();

}

return sessionId;

}

 

 

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private static boolean copyInstallFile(PackageInstaller packageInstaller,

int sessionId, String apkFilePath) {

 

MediaLogUtils.d("--->>>copyInstallFile()--->>> sessionId:"+sessionId+", apkFilePath:"+apkFilePath);

InputStream in = null;

OutputStream out = null;

PackageInstaller.Session session = null;

boolean success = false;

try {

File apkFile = new File(apkFilePath);

session = packageInstaller.openSession(sessionId);

out = session.openWrite("base.apk", 0, apkFile.length());

in = new FileInputStream(apkFile);

int total = 0, c;

byte[] buffer = new byte[65536];

while ((c = in.read(buffer)) != -1) {

total += c;

out.write(buffer, 0, c);

}

session.fsync(out);

Log.i(TAG, "streamed " + total + " bytes");

success = true;

} catch (IOException e) {

e.printStackTrace();

} finally {

IoUtils.closeQuietly(out);

IoUtils.closeQuietly(in);

IoUtils.closeQuietly(session);

}

return success;

}

 

 

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private static void execInstallCommand(Context context, PackageInstaller packageInstaller, int sessionId) {

 

MediaLogUtils.d("--->>>execInstallCommand()--->>> sessionId:"+sessionId);

PackageInstaller.Session session = null;

try {

session = packageInstaller.openSession(sessionId);

Intent intent = new Intent(context, InstallResultReceiver.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

session.commit(pendingIntent.getIntentSender());

} catch (IOException e) {

e.printStackTrace();

} finally {

IoUtils.closeQuietly(session);

}

}

 

 

public static class InstallResultReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Log.d(TAG, "onReceive() -> intent: "+intent.getAction());

if (intent != null) {

final int status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS,

PackageInstaller.STATUS_FAILURE);

if (status == PackageInstaller.STATUS_SUCCESS) {

// success

Log.d(TAG, "onReceive -> install success");

} else {

Log.d(TAG, "onReceive -> install fail");

}

}

}

}

 

public final static class IoUtils {

 

public static void closeQuietly(Closeable c) {

if (c != null) {

try {

c.close();

} catch (IOException ignored) {

ignored.printStackTrace();

}

}

}

 

public static void closeQuietly(Socket c) {

if (c != null) {

try {

c.close();

} catch (IOException ignored) {

ignored.printStackTrace();

}

}

}

}

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值