【Android智能硬件开发】【004】通过PackageInstaller静默安装apk

发布时间:2025-12-09 17:43:55 浏览次数:4

前言

智能硬件不同于普通手机,大多是无人值守的,所以升级时只能采用静默升级,即后台自动升级的方式

PackageInstaller是安卓系统底层用于apk安装的管理类,只有系统级别的应用,才能使用这个类的功能

关于如何将APK升级为系统应用,我们在上篇博客中已经讲解过了

静默安装apk

apkFile是apk文件相当于存储卡根目录的路径

packageName是要安装的apk的包名

安装apk代码

//静默升级APP@SneakyThrowspublic void silenceInstall(String apkFile, String packageName) {//写入APK到InstallerSessionPackageInstaller installer = activity.getPackageManager().getPackageInstaller();PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);int sessionId = installer.createSession(params);PackageInstaller.Session session = installer.openSession(sessionId);writeApkToSession(session, apkFile, packageName);//安装APKIntent intent = new Intent(activity, HomeActivity.class);intent.setAction("com.android.package.installer.session.PACKAGE_INSTALLED");PendingIntent pendingIntent = PendingIntent.getActivity(activity, 0, intent, 0);IntentSender sender = pendingIntent.getIntentSender();session.commit(sender);}//写入APK到InstallerSession@SneakyThrowsprotected void writeApkToSession(PackageInstaller.Session session, String apkFile, String packageName) {String file = AndroidFile.getAndroidExternalFile(apkFile);OutputStream os = session.openWrite(packageName, 0, -1);InputStream is = new FileInputStream(file);byte[] buffer = new byte[1024 * 1024];int len;while ((len = is.read(buffer)) >= 0)os.write(buffer, 0, len);os.flush();os.close();is.close();}

调用代码

//调用WorkThread.post(() -> {handler2.silenceInstall("222.apk", "com.tencent.qqpinyin");});

安装回调,安装需要一段时间,由于是静默安装,看不到任何界面,请耐心等待

@Overrideprotected void onNewIntent(Intent intent) {String action = intent.getAction();Bundle extras = intent.getExtras();if ("com.android.package.installer.session.PACKAGE_INSTALLED".equals(action)) {int status = extras.getInt(PackageInstaller.EXTRA_STATUS);boolean success = status == PackageInstaller.STATUS_SUCCESS;TipBox.tipInCenter(success ? "静默安装成功" : "静默安装失败");}}

之所以能触发此回调,是因为我们在安装的Intent中,设置了对应的Action

只要我们Activity的Action与之相匹配,就可以被该Action调用打开

<activityandroid:name="com.android.app.hardware.biz_activity.HomeActivity"android:launchMode="singleInstance"android:screenOrientation="landscape"><intent-filter><action android:name="android.intent.action.MAIN" /><action android:name="com.android.package.installer.session.PACKAGE_INSTALLED" /><category android:name="android.intent.category.LAUNCHER" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477