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

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(){
            @Override
            public 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() {
					@Override
					public 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() {
					@Override
					public 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)));
        }
    }

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


http://www.kler.cn/a/298852.html

相关文章:

  • webrtc音频模块(三) windows Core Audio API及声音的播放
  • 12寸半导体厂等保安全的设计思路
  • Linux export命令
  • python学opencv|读取图像(十八)使用cv2.line创造线段
  • Android Studio IDE环境配置
  • Vue3之状态管理Vuex
  • 经验笔记:SQL调优
  • Java 入门指南:Java 并发编程 —— Copy-On-Write 写时复制技术
  • ElasticSearch的DSL查询④(DSL查询、RestClient的DSL查询)
  • Linux内核 -- 内存管理之 lru_cache_add_inactive_or_unevictable 函数
  • go切片的深入学习以及context库的使用
  • 一道迭代器失效练习题
  • SparkSQL FUNCTION相关操作
  • 基于Spring Boot的小区物业管理系统
  • 本地Gitblit使用
  • 使用Pandas高效读取和处理Excel数据
  • 静态内部类
  • MySQL中的redo log、 undo log、bin log
  • 提前购|基于SSM+vue的创新型产品提前购平台(源码+数据库+文档)
  • docker进阶 compose等
  • 指针 (五)
  • uniapp,vite整合windicss
  • CSS全面知识点及其应用
  • vue3项目如何设置同样的接口第一次请求有效,如果第二次请求同样的接口,则不去请求,因为第一次请求还没有返回数据
  • python 图片识别文字
  • WPS VBA插件使用说明