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

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

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

}

}

}

}

}

猜你喜欢

转载自blog.csdn.net/heshuangqiang/article/details/125882553