当前位置: 首页 > news >正文

Android11 MTK 安装apk时进行密码验证

1、客户需求

		客户要求,在安装apk文件时,进行密码验证。apk文件来源包括浏览器下载、内存中、外接SDK中、adb命令安装等。之后在测试过程,又添加了一个限制,输入错误密码超过3次,则放弃本次安装。

2、解决

	路径:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java	
private void showConfirmPwd(final InstallArgs args, final int currentStatus){mHandler.post(new Runnable(){@Overridepublic void run(){AlertDialog.Builder builder = new AlertDialog.Builder(mContext);builder.setCancelable(false);builder.setTitle(R.string.pwd_dialog_title);final EditText et = new EditText(mContext);builder.setView(et);builder.setPositiveButton(R.string.pwd_sure, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {String etPwd = et.getText().toString();if(etPwd == null || etPwd.equals("")){inputCount++;if(inputCount >= 3){processPendingInstall2(args,PackageManager.INSTALL_FAILED_USER_RESTRICTED );}else{Toast.makeText(mContext,R.string.pwd_dialog_title,Toast.LENGTH_SHORT).show();showConfirmPwd(mLzyArgs,mLzyCurrentStatus);}}else{if(!etPwd.equals(android.provider.Settings.System.getString(mContext.getContentResolver(),android.provider.Settings.System.SYS_PASSWORD))){inputCount++;if(inputCount >= 3){processPendingInstall2(args,PackageManager.INSTALL_FAILED_USER_RESTRICTED );}else{Toast.makeText(mContext, R.string.pwd_correct,Toast.LENGTH_LONG).show();showConfirmPwd(mLzyArgs,mLzyCurrentStatus);}}else{dialog.dismiss();processPendingInstall2(args,currentStatus);}}}});builder.setNegativeButton(R.string.pwd_cancel, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialog.dismiss();processPendingInstall2(args,PackageManager.INSTALL_FAILED_USER_RESTRICTED );}});dialog = builder.create();dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);dialog.show();}});}private String getInstallPkgName(InstallArgs args){PackageParser parser = new PackageParser();if((args.getCodePath() == null) || (args.getCodePath().equals(""))){return null;}try {PackageParser.Package pkg = parser.parsePackage(new File(args.getCodePath()), 0, true);return pkg.packageName; // 返回包名} catch (PackageParser.PackageParserException e) {// 处理异常,例如打印错误日志Log.d("InstallArgs", "Unable to parse package at " + args.getCodePath(), e);return null;}}private InstallArgs mLzyArgs;private int mLzyCurrentStatus;private int inputCount = 0;private void processPendingInstall(final InstallArgs args, final int currentStatus) {mLzyArgs = args;mLzyCurrentStatus = currentStatus;String mInstallPackageName = getInstallPkgName(args);if(mInstallPackageName == null){processPendingInstall2(args,PackageManager.INSTALL_FAILED_USER_RESTRICTED);}else if (mInstallPackageName.equals("com.android.vending") || mInstallPackageName.equals("com.google.android.gms")){processPendingInstall2(args,currentStatus);}else{inputCount = 0;showConfirmPwd(args,currentStatus);}}private void processPendingInstall2(final InstallArgs args, final int currentStatus) {if (args.mMultiPackageInstallParams != null) {args.mMultiPackageInstallParams.tryProcessInstallRequest(args, currentStatus);} else {PackageInstalledInfo res = createPackageInstalledInfo(currentStatus);processInstallRequestsAsync(res.returnCode == PackageManager.INSTALL_SUCCEEDED,Collections.singletonList(new InstallRequest(args, res)));}}

注:如果是谷歌服务等更新,则不需要输入密码,直接安装。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在Unity环境中使用UTF-8编码
  • SQL COUNT() 函数深入解析
  • MapSet之二叉搜索树
  • InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE)
  • ARM基础知识---CPU---处理器
  • QT Creator在线安装包、离线包下载链接
  • Java并发:互斥锁,读写锁,Condition,StampedLock
  • 在Spring Boot中通过自定义注解、反射以及AOP(面向切面编程)
  • vite+vue3+typescript+elementPlus前端实现电子证书查询系统
  • RabbitMQ 基础架构流程 数据隔离 创建用户
  • Java高级Day38-网络编程作业
  • 如何打造高校实验室教学管理系统?Java SpringBoot助力,MySQL存储优化,2025届必备设计指南
  • 【Linux】Linux 管道:进程间通信的利器
  • 【微信小程序】搭建项目步骤 + 引入Tdesign UI
  • 计算机网络(三) —— 简单Udp网络程序
  • [nginx文档翻译系列] 控制nginx
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【面试系列】之二:关于js原型
  • 2017 前端面试准备 - 收藏集 - 掘金
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Babel配置的不完全指南
  • css布局,左右固定中间自适应实现
  • css系列之关于字体的事
  • ES6简单总结(搭配简单的讲解和小案例)
  • ES学习笔记(12)--Symbol
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Java|序列化异常StreamCorruptedException的解决方法
  • js数组之filter
  • MQ框架的比较
  • Python_网络编程
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SpringBoot几种定时任务的实现方式
  • webgl (原生)基础入门指南【一】
  • 从0实现一个tiny react(三)生命周期
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 小程序button引导用户授权
  • 携程小程序初体验
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一、python与pycharm的安装
  • - 转 Ext2.0 form使用实例
  • Linux权限管理(week1_day5)--技术流ken
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ### RabbitMQ五种工作模式:
  • #100天计划# 2013年9月29日
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $jQuery 重写Alert样式方法
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (20050108)又读《平凡的世界》
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (LLM) 很笨
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)node.js知识分享网站 毕业设计 202038