package cm.android.common.pm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageInstaller; import android.os.Build; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import cm.java.util.IoUtil; /** * The type Installer. */ public class Installer { private static final Logger logger = LoggerFactory.getLogger("pm"); /** * The constant ACTION_INSTALL_COMPLETE. */ public static final String ACTION_INSTALL_COMPLETE = "cm.android.intent.action.INSTALL_COMPLETE"; /** * The constant ACTION_UNINSTALL_COMPLETE. */ public static final String ACTION_UNINSTALL_COMPLETE = "cm.android.intent.action.UNINSTALL_COMPLETE"; /** * Install. * * @param context the context * @param packageName the package name * @param apkPath the apk path */ public static void install(Context context, String packageName, String apkPath) { logger.info("install:packageName = {},apkPath = {}", packageName, apkPath); InputStream in = null; OutputStream out = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PackageInstaller.Session session = null; try { in = new FileInputStream(new File(apkPath)); PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); //TODO ggg 通过apkPath读取 params.setAppPackageName(packageName); // set params int sessionId = packageInstaller.createSession(params); session = packageInstaller.openSession(sessionId); out = session.openWrite("Installer", 0, -1); IoUtil.write(in, out, 64 * 1024); session.fsync(out); IoUtil.closeQuietly(in); IoUtil.closeQuietly(out); session.commit(createIntentSender(context, sessionId, ACTION_INSTALL_COMPLETE)); } catch (IOException e) { logger.error(e.getMessage(), e); } finally { IoUtil.closeQuietly(session); } } } /** * Uninstall. * * @param context the context * @param packageName the package name */ public static void uninstall(Context context, String packageName) { logger.info("uninstall:packageName = {}", packageName); // Intent intent = new Intent(context, context.getClass()); // PendingIntent sender = PendingIntent.getActivity(context, 0, intent, 0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); packageInstaller.uninstall(packageName, createIntentSender(context, 0, ACTION_UNINSTALL_COMPLETE)); } } private static IntentSender createIntentSender(Context context, int sessionId, String action) { PendingIntent pendingIntent = PendingIntent.getBroadcast(context, sessionId, new Intent(action), 0); return pendingIntent.getIntentSender(); } }