您当前的位置: 首页 >  硬件开发

命运之手

暂无认证

  • 1浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

命运之手 发布时间:2021-11-26 20:38:39 ,浏览量:1

前言

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

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

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

静默安装apk

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

packageName是要安装的apk的包名

安装apk代码


	//静默升级APP
	@SneakyThrows
	public void silenceInstall(String apkFile, String packageName) {
	    //写入APK到InstallerSession
	    PackageInstaller 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);
	    //安装APK
	    Intent 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
	@SneakyThrows
	protected 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");
	});

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


	@Override
	protected 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调用打开


	
	    
	        
	        
	        
	        
	    
	

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0434s