需求:点击更新应用进行安装的过程中弹出“未知来源”设置提示,需要跳过该步骤直接安装。

方案1

分析:

1.首先9.0 app安装是通过packages/apps/PackageInstaller里面的应用进行安装的。

2.其次定位到安装界面是/src/com/android/packageinstaller/PackageInstallerActivity.java

3.查看handleUnknownSources里面进行了代码控制,至此问题已解决(或者直接通过appOpMode和包名进行判断调用initiateInstall()函数也行,不建议),但是我们还得深入看下弹框做了什么动作。。。

 private void handleUnknownSources() {if (mOriginatingPackage == null) {Log.i(TAG, "No source found for package " + mPkgInfo.packageName);showDialogInner(DLG_ANONYMOUS_SOURCE);return;}Log.e(TAG, "wgd==No source found for package " + mPkgInfo.packageName);// Shouldn't use static constant directly, see b/65534401.//提前设置允许该应用获取未知来源权限if("com.ctg.itrdc.clouddesk".equals(mPkgInfo.packageName)){mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES, mOriginatingUid,mPkgInfo.packageName, AppOpsManager.MODE_ALLOWED);}final int appOpCode =AppOpsManager.permissionToOpCode(Manifest.permission.REQUEST_INSTALL_PACKAGES);final int appOpMode = mAppOpsManager.noteOpNoThrow(appOpCode,mOriginatingUid, mOriginatingPackage);//根据appOpMode判断是否已获得未知来源安装权限   MODE_ERRORED没获取  MODE_ALLOWED已获取  switch (appOpMode) {case AppOpsManager.MODE_DEFAULT:mAppOpsManager.setMode(appOpCode, mOriginatingUid,mOriginatingPackage, AppOpsManager.MODE_ERRORED);// fall throughcase AppOpsManager.MODE_ERRORED:showDialogInner(DLG_EXTERNAL_SOURCE_BLOCKED);break;case AppOpsManager.MODE_ALLOWED:initiateInstall();break;default:Log.e(TAG, "Invalid app op mode " + appOpMode+ " for OP_REQUEST_INSTALL_PACKAGES found for uid " + mOriginatingUid);finish();break;}}

4.showDialogInner(DLG_EXTERNAL_SOURCE_BLOCKED)弹框做了什么工作呢? 接下来调用了创建窗口函数createDialog()

 /*** Replace any dialog shown by the dialog with the one for the given {@link #createDialog id}.** @param id The dialog type to add*/private void showDialogInner(int id) {DialogFragment currentDialog =(DialogFragment) getFragmentManager().findFragmentByTag("dialog");if (currentDialog != null) {currentDialog.dismissAllowingStateLoss();}DialogFragment newDialog = createDialog(id);if (newDialog != null) {newDialog.showAllowingStateLoss(getFragmentManager(), "dialog");}}
 /*** Create a new dialog.** @param id The id of the dialog (determines dialog type)** @return The dialog*/private DialogFragment createDialog(int id) {switch (id) {case DLG_PACKAGE_ERROR:return SimpleErrorDialog.newInstance(R.string.Parse_error_dlg_text);case DLG_OUT_OF_SPACE:return OutOfSpaceDialog.newInstance(mPm.getApplicationLabel(mPkgInfo.applicationInfo));case DLG_INSTALL_ERROR:return InstallErrorDialog.newInstance(mPm.getApplicationLabel(mPkgInfo.applicationInfo));case DLG_NOT_SUPPORTED_ON_WEAR:return NotSupportedOnWearDialog.newInstance();case DLG_INSTALL_APPS_RESTRICTED_FOR_USER:return SimpleErrorDialog.newInstance(R.string.install_apps_user_restriction_dlg_text);case DLG_UNKNOWN_SOURCES_RESTRICTED_FOR_USER:return SimpleErrorDialog.newInstance(R.string.unknown_apps_user_restriction_dlg_text);case DLG_EXTERNAL_SOURCE_BLOCKED://未知来源return ExternalSourcesBlockedDialog.newInstance(mOriginatingPackage);case DLG_ANONYMOUS_SOURCE:return AnonymousSourceDialog.newInstance();}return null;}
 /*** An error dialog shown when external sources are not allowed*/public static class ExternalSourcesBlockedDialog extends AppErrorDialog {static AppErrorDialog newInstance(@NonNull String originationPkg) {ExternalSourcesBlockedDialog dialog = new ExternalSourcesBlockedDialog();dialog.setArgument(originationPkg);return dialog;}@Overrideprotected Dialog createDialog(@NonNull CharSequence argument) {try {PackageManager pm = getActivity().getPackageManager();ApplicationInfo sourceInfo = pm.getApplicationInfo(argument.toString(), 0);return new AlertDialog.Builder(getActivity()).setTitle(pm.getApplicationLabel(sourceInfo)).setIcon(pm.getApplicationIcon(sourceInfo)).setMessage(R.string.untrusted_external_source_warning).setPositiveButton(R.string.external_sources_settings,(dialog, which) -> {Intent settingsIntent = new Intent();settingsIntent.setAction(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);final Uri packageUri = Uri.parse("package:" + argument);settingsIntent.setData(packageUri);try {getActivity().startActivityForResult(settingsIntent,REQUEST_TRUST_EXTERNAL_SOURCE);} catch (ActivityNotFoundException exc) {Log.e(TAG, "Settings activity not found for action: "+ Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);}}).setNegativeButton(R.string.cancel,(dialog, which) -> getActivity().finish()).create();} catch (NameNotFoundException e) {Log.e(TAG, "Did not find app info for " + argument);getActivity().finish();return null;}}}

Intent settingsIntent = new Intent();

settingsIntent.setAction(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);

接下来主要看看是跳转到哪了,这其实调用到设置apk里面了。通过界面文字搜索最终定位到

/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java类

最终发现设置打开应用“未知来源”权限执行了以下代码,至此得出第3步修改方案。

我们也可以按照下面进行初始化实现

    private void openAppInstallUnknownSource(Context context){try {String packageName = SystemProperties.get("persist.sys.app_install_unknown_source");if(!android.text.TextUtils.isEmpty(packageName)){AppOpsManager mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);PackageManager mPm = context.getPackageManager();PackageInfo mPackageInfo = mPm.getPackageInfo(packageName,PackageManager.MATCH_DISABLED_COMPONENTS |PackageManager.MATCH_ANY_USER |PackageManager.GET_SIGNATURES |PackageManager.GET_PERMISSIONS);mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,mPackageInfo.applicationInfo.uid, packageName,AppOpsManager.MODE_ALLOWED);}}catch (Exception e) {Log.e(TAG, "Exception" + e);}}

修改方案2:

frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java

在private void grantDefaultSystemHandlerPermissions(int userId) 函数中添加如下代码:

 PackageParser.Package feedBackPackage = getPackage("net.sunniwell.dss");if (feedBackPackage != null&& doesPackageSupportRuntimePermissions(feedBackPackage)) {grantRuntimePermissions(feedBackPackage, STORAGE_PERMISSIONS, userId);} 

2.判断是否已获取未知来源权限

//getPackageManager()表示当前应用是否获得未知来源权限,一般用于自升级判断
boolean canRequestPackageInstalls = getPackageManager().canRequestPackageInstalls();
log.d("upgradech:canRequestPackageInstalls = " + canRequestPackageInstalls);

android 9.0跳过“未知来源”进行安装应用相关推荐

  1. Android 10.0 ​默认允许未知来源权限安装

    ​默认允许未知来源权限安装 ​ 活动地址:CSDN21天学习挑战赛 系统app的权限默认开启,大家应该都知道是修改DefaultPermissionGrantPolicy.java. framewor ...

  2. Android无法安装apk,8.0未知来源应用安装权限

    Android 新版本的出现 ,适配Android8.0未知来源应用安装权限处理 1.在清单文件中增加请求安装权限 <uses-permission android:name="and ...

  3. Android8.0未知来源应用安装权限最好的适配方案

    Android8.0未知来源应用安装权限最好的适配方案 你弄啥嘞 24 天前 Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用 ...

  4. android限制安装包来源,Android系统设置settings应用学习(一)--允许未知来源应用安装...

    settings,是Android系统应用--设置的源代码,包名称为:com.android.settings 安全设置代码:SecuritySettings.java /* * Copyright ...

  5. Android8.0未知来源应用安装权限

    Android8.0未知来源应用安装权限 Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限(危险权限) android6.0到android8.0之前安装未知来源应用的时候一般 ...

  6. android 5.0跳转动画,android Lollipop(5.0)--activity跳转动画

    android Lollipop(5.0)对app中有共享view的activity直接的跳转提供了更好的动画交互. 实现步骤: 1,编写需要的transform. 2,给activity设置样式st ...

  7. Android 开发 之 8.0应用安装权限(未知应用权限安装)

    未知来源应用权限 Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应 ...

  8. Android 7.0 8.0 升级兼容

    一.7.0 问题记录 参考 1. 安装APK报错,FileUriExposedException 2. 调取系统相机崩溃,FileUriExposedException 二.8.0 问题记录 参考 1 ...

  9. Android 8.0 app内覆盖安装

    <!-- 8.0以上系统自动安装更新app会闪退,需要申请权限 --> <uses-permission android:name="android.permission. ...

最新文章

  1. iOS开发网络篇—使用ASI框架进行文件下载
  2. 【面试题】Spring框架中Bean的生命周期
  3. PuppeteerSharp: 更友好的 Headless Chrome C# API
  4. 在8080端口输出php的输出,端口8080上的PHP错误
  5. 作者:张悦今,女,中央财经大学信息学院讲师。
  6. field list什么意思_时序数据库有什么不一样?
  7. RouterOS 5.22固定公网IP共享上网设置
  8. TextAppearance.Material.Widget.Button.Inverse,Widget.Material.Button.Colored
  9. pycharm debug 单步调试太卡太慢解决方案
  10. Google账户解封秘籍:这样申诉,分分钟解封Google 账户!
  11. c#控件chart制作自动更新的温湿度实时曲线图
  12. 利用Windows注册Dll或其他文件
  13. 软件一定存在修改的余地——《大话Java性能优化》
  14. exit( )和_exit()的区别(https://blog.csdn.net/lwj10386)
  15. 《伸手系列》之分布式锁Redssion入门和源码解析
  16. Java蓝桥模拟战——特殊的数字:153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
  17. 浏览器开发者模式下你不可错过的Network面板知识
  18. Python os.listdir()函数用法介绍
  19. Unity UGUI图文混排(六) -- 超链接
  20. 微信小程序不显示base64位图片

热门文章

  1. WIN32 错误处理
  2. No.11 position定位 之 fixed固定定位
  3. 如何建立高效的质量管理系统?
  4. java程序员简历上的哪些内容才是面试者眼中的干货
  5. Appium Python API中文文档
  6. Bert文本聚类实践
  7. 超市综合信息管理系统系统可行性如何写
  8. ubuntu16.04下postgresql常用命令,及图形化管理界面pgadmin3
  9. https在jsp中简单使用
  10. Microsoft Visual C++下载,VC++下载