精华内容
下载资源
问答
  • 2018-06-26 17:53:49

    关于系统设置的代码,基本都在android.provider.Settings类中。仔细查看Settings类,可以找到如下的常量值:

            /**
            * Whether applications can be installed for this user via the system's
            * {@link Intent#ACTION_INSTALL_PACKAGE} mechanism.
            *
            * <p>1 = permit app installation via the system package installer intent
            * <p>0 = do not allow use of the package installer
            */
           public static final String INSTALL_NON_MARKET_APPS = "install_non_market_apps";
    

    根据翻译,猜测这个常量就是用来控制是否允许安装未知来源应用的。

       /**
         * 允许安装未知来源的应用
         */
        public static void allowUnKnowSrc(Context context){
            try {
                android.provider.Settings.Global.putInt(context.getContentResolver(),
                        android.provider.Settings.Secure.INSTALL_NON_MARKET_APPS,1);
            }catch (SecurityException e){
                //LogUtils.getInstance().d(e);
            }
        }

    用以上代码进行测试,果然是对的。其中的变量:1代表允许,如果换成0则代表禁止。
    其它的一些系统设置,比如系统时间时区的设置,系统屏幕亮度的设置等,都可以用以上的形式操作。在Settings类中找到相应的常量值即可。

    ps:要有系统权限,以及写系统设置的权限!

    更多相关内容
  • Android允许应用具有安装权限

    千次阅读 2021-06-12 09:31:44
    本文只针对调用PackageInstaller安装流程,ROM中有时需要集成一些第三方的应用商城或着launcher,但需要此应用可能具有安装权限。功能很简单直接贴代码; PackageInstallerActivity中有个...

         本文只针对调用PackageInstaller安装流程,ROM中有时需要集成一些第三方的应用商城或着launcher,但需要此应用可能具有安装权限,像大部分机顶盒设备,投影设备禁止安装未知来源的控制对用户是不可见的,功能很简单直接贴代码;

         PackageInstallerActivity中有个checkIfAllowedAndInitiateInstall()函数来判断是否允许安装,允许的话会调用initiateInstall()弹出安装应用的界面,禁止安装未知来源的应用时会弹出禁止安装未知来源的dialog;

         PackageInstallerActivity中有个变量mOriginatingPackage,此变量就是调用安装应用事件的应用的包名,只需在initiateInstall()的if判断中加入自己的判断逻辑即可。

    /**
    *检查是否允许安装包,如果允许,则启动安装。如果不允许
    *显示相应的对话框。
    */
        private void checkIfAllowedAndInitiateInstall() {
            // Check for install apps user restriction first.
            final int installAppsRestrictionSource = mUserManager.getUserRestrictionSource(
                    UserManager.DISALLOW_INSTALL_APPS, Process.myUserHandle());
            if ((installAppsRestrictionSource & UserManager.RESTRICTION_SOURCE_SYSTEM) != 0) {
                showDialogInner(DLG_INSTALL_APPS_RESTRICTED_FOR_USER);
                return;
            } else if (installAppsRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
                startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
                finish();
                return;
            }
            //看这里的判断条件1.允许安装未知来源应用 2.非未知来源应用发起的安装事件
            //3.这是我加的逻辑
            if (mAllowUnknownSources || !isInstallRequestFromUnknownSource(getIntent()) || new StmConfig().isUserCustomAllowInstallPkg(mOriginatingPackage)) {
                initiateInstall();
            } else {
                // Check for unknown sources restriction
                final int unknownSourcesRestrictionSource = mUserManager.getUserRestrictionSource(
                        UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, Process.myUserHandle());
                if ((unknownSourcesRestrictionSource & UserManager.RESTRICTION_SOURCE_SYSTEM) != 0) {
                    showDialogInner(DLG_UNKNOWN_SOURCES_RESTRICTED_FOR_USER);
                } else if (unknownSourcesRestrictionSource != UserManager.RESTRICTION_NOT_SET) {
                    startActivity(new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS));
                    finish();
                } else {
                    handleUnknownSources();
                }
            }
        }

     

    展开全文
  • 当你的应用适配到8.0后,会检测是否允许未知来源系统,没有打开的话会弹框提示去打开
  • 对AndPermission的封装,用于快速申请Android权限,链式调用,适配绝大多数国产系统。
  • 安装未知来源权限其实就是这货 Manifest.permission.REQUEST_INSTALL_PACKAGES,具体的修改代码方案已经在上篇 Android9.0/8.1/6.0 默认给系统 app 授予所有权限中提供了。这篇只是分析解题思路。 核心方法如下 if ...

    之前 6.0 的未知来源权限是一个总的权限,现在单独分开了具体到 app 对应的权限了。具体可见截图

    在这里插入图片描述

    安装未知来源权限其实就是这货 Manifest.permission.REQUEST_INSTALL_PACKAGES,具体的修改代码方案已经在上篇 Android9.0/8.1/6.0 默认给系统 app 授予所有权限中提供了。这篇只是分析解题思路。

    核心方法如下

     if (checkInstallPackagesPermission(pkgName, mPackageInfo)) {
                         Log.e(TAG, pkgName + " need grant INSTALL_PACKAGES permission");
                         mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,
                            mPackageInfo.applicationInfo.uid, pkgName, AppOpsManager.MODE_ALLOWED);
                         Log.e(TAG, "grant INSTALL_PACKAGES permission done");
    }
    
    private static boolean checkInstallPackagesPermission(String packageName, PackageInfo mPackageInfo){
            int uid = mPackageInfo.applicationInfo.uid;
            //boolean permissionGranted = hasPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES, uid);
            boolean permissionRequested = hasRequestedAppOpPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES, packageName);
            int appOpMode = getAppOpMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES, uid, packageName);
    
            return appOpMode != AppOpsManager.MODE_DEFAULT || permissionRequested;
        }
    
        private static int getAppOpMode(int appOpCode, int uid, String packageName) {
            return mAppOpsManager.checkOpNoThrow(appOpCode, uid, packageName);
        }
    
        private static boolean hasRequestedAppOpPermission(String permission, String packageName) {
            try {
                String[] packages = mIpm.getAppOpPermissionPackages(permission);
                return ArrayUtils.contains(packages, packageName);
            } catch (Exception exc) {
                Log.e(TAG, "PackageManager dead. Cannot get permission info");
                return false;
            }
        }
    
    
    

    从 Settings 说起,我们看见的设置界面中有允许未知来源的 Preference,经过搜索找到 InstalledAppDetails,允许未知来源是动态增加的 Preference ,看如下代码

    vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\applications\InstalledAppDetails.java

     private void addDynamicPrefs() {
            if (UserManager.get(getContext()).isManagedProfile()) {
                return;
            }
    
    		...
    
    		 boolean isPotentialAppSource = isPotentialAppSource();
    
    
    		if (isPotentialAppSource) {
                    Preference pref = new Preference(getPrefContext());
                    pref.setTitle(R.string.install_other_apps);
                    pref.setKey("install_other_apps");
                    pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                        @Override
                        public boolean onPreferenceClick(Preference preference) {
                            startAppInfoFragment(ExternalSourcesDetails.class,
                                    getString(R.string.install_other_apps));
                            return true;
                        }
                    });
                    category.addPreference(pref);
                }
            }
    
            addAppInstallerInfoPref(screen);
            maybeAddInstantAppButtons();
     }
    
        private boolean isPotentialAppSource() {
            AppStateInstallAppsBridge.InstallAppsState appState =
                    new AppStateInstallAppsBridge(getContext(), null, null)
                            .createInstallAppsStateFor(mPackageName, mPackageInfo.applicationInfo.uid);
            return appState.isPotentialAppSource();
        }
    
    

    isPotentialAppSource 值决定当前 app 详情页面是否需要显示允许来自此来源的应用,isPotentialAppSource() 中初始化了 AppStateInstallAppsBridge对象,并由该对象的isPotentialAppSource()返回。
    vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\applications\AppStateInstallAppsBridge.java

    InstallAppsState createInstallAppsStateFor(String packageName, int uid) {
            final InstallAppsState appState = new InstallAppsState();
            appState.permissionRequested = hasRequestedAppOpPermission(
                    Manifest.permission.REQUEST_INSTALL_PACKAGES, packageName);
            appState.permissionGranted = hasPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES,
                    uid);
            appState.appOpMode = getAppOpMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES, uid,
                    packageName);
            return appState;
        }
    
    
    public static class InstallAppsState {
            boolean permissionRequested;
            boolean permissionGranted;
            int appOpMode;
    
    		public InstallAppsState() {
    	            this.appOpMode = AppOpsManager.MODE_DEFAULT;
    	    }
    
    		....
    
    
    		public boolean isPotentialAppSource() {
                Log.e("ExternalSources","appOpMode="+(appOpMode != AppOpsManager.MODE_DEFAULT));
                Log.e("ExternalSources","permissionRequested="+permissionRequested);
                return appOpMode != AppOpsManager.MODE_DEFAULT || permissionRequested;
            }
    	
    		....
    
    }
    
    

    InstallAppsState 构造函数初始化将赋值 appOpMode = AppOpsManager.MODE_DEFAULT,

    appOpMode 的取值有

    public static final int MODE_ALLOWED = 0;
    public static final int MODE_IGNORED = 1;
    public static final int MODE_ERRORED = 2;
    public static final int MODE_DEFAULT = 3;

    isPotentialAppSource() 的返回值取决于 appOpMode 和 permissionRequested,这两值在 createInstallAppsStateFor() 被重新赋值,继续看对应的方法

    
    public AppStateInstallAppsBridge(Context context, ApplicationsState appState,
                Callback callback) {
            super(appState, callback);
            mIpm = AppGlobals.getPackageManager();
            mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        }
    
    private boolean hasRequestedAppOpPermission(String permission, String packageName) {
            try {
                Log.e(TAG, "packageName "+packageName);
                String[] packages = mIpm.getAppOpPermissionPackages(permission);
                for (String pck : packages) {
                    Log.e(TAG, "PackageManager "+pck);
                }
                return ArrayUtils.contains(packages, packageName);
            } catch (RemoteException exc) {
                Log.e(TAG, "PackageManager dead. Cannot get permission info");
                return false;
            }
     }
    
    
    private int getAppOpMode(int appOpCode, int uid, String packageName) {
            return mAppOpsManager.checkOpNoThrow(appOpCode, uid, packageName);
     }
    
    

    通过 AppOpsManager 获取当前 app 的模式

    通过 IPackageManager 获取包含 REQUEST_INSTALL_PACKAGES 权限的包名数组,判断当前包名是否在其中

    好了,是否需要显示此权限的逻辑搞清楚了,接下来再看如何授权?

    InstalledAppDetails 中 Preference 点击事件对应

    startAppInfoFragment(ExternalSourcesDetails.class, getString(R.string.install_other_apps));

    对应的页面为 ExternalSourcesDetails

    vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\applications\ExternalSourcesDetails.java

    @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            final boolean checked = (Boolean) newValue;
            if (preference == mSwitchPref) {
                if (mInstallAppsState != null && checked != mInstallAppsState.canInstallApps()) {
                    if (Settings.ManageAppExternalSourcesActivity.class.getName().equals(
                            getIntent().getComponent().getClassName())) {
                        setResult(checked ? RESULT_OK : RESULT_CANCELED);
                    }
                    setCanInstallApps(checked);
                    refreshUi();
                }
                return true;
            }
            return false;
        }
    
    private void setCanInstallApps(boolean newState) {
            mAppOpsManager.setMode(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES,
                    mPackageInfo.applicationInfo.uid, mPackageName,
                    newState ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_ERRORED);
        }
    
    

    点击 RestrictedSwitchPreference 时通过 AppOpsManager 修改 mode 为 AppOpsManager.MODE_ALLOWED

    展开全文
  • 申请安装未知应用权限(android8.0以上)
        private static final int INSTALL_PERMISSION_CODE = 1;
        
        public void setInstallPermission(Context context) {
            boolean haveInstallPermission;
            // android 8.0以上安装未知应用需要开启权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                // 先判断是否有安装未知应用权限
                haveInstallPermission = getPackageManager().canRequestPackageInstalls();
                if (!haveInstallPermission) {
                    // 弹框提示用户手动打开
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Looper.prepare();
                            AlertDialog.Builder builder = new AlertDialog.Builder(context);
                            builder.setTitle("安装权限");
                            builder.setMessage("需要打开此应用允许安装未知应用的权限");
                            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                                        // 此方法需要API >= 26才能使用
                                        toInstallPermissionSettingIntent();
                                    }
                                }
                            });
                            builder.setCancelable(false);
                            AlertDialog dialog = builder.create();
                            dialog.show();
                            Looper.loop();
                        }
                    }).start();
                } else {
                    Toast.makeText(MainActivity.this, "安装应用", Toast.LENGTH_LONG).show();
                }
            } else {
                Toast.makeText(MainActivity.this, "安装应用", Toast.LENGTH_LONG).show();
            }
        }
    
        private void toInstallPermissionSettingIntent() {
            Uri packageURI = Uri.parse("package:" + getPackageName());
            Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
            startActivityForResult(intent, INSTALL_PERMISSION_CODE);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == RESULT_OK && requestCode == INSTALL_PERMISSION_CODE) {
                Toast.makeText(MainActivity.this, "安装应用", Toast.LENGTH_LONG).show();
            }
        }

    展开全文
  • 未知来源应用权限   Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都...
  • Android 11 允许安装未知来源权限 变动 一、部分机型兼容问题 最近在为Flutter端封装 下载apk并安装 的功能,众所周知,在安装之前我们要请求 ‘允许安装未知来源’ 这个权限,然后我就写了以下代码(部分代码) if ...
  • Android8.0未知来源应用安装权限处理

    千次阅读 2021-01-17 10:21:59
    Android 新版本的出现 ,适配Android8.0未知来源应用安装权限处理1、在清单文件中增加请求安装权限private void showChangCityDialog() {CustomDialog.Builder builder = new CustomDialog.Builder(mContext);...
  • 在9.0 以前的设备中,安装未来来源的权限开关 可以在SettingsProvider.app中的 DateHelper.java中通过一个config.xml中的 开关打开 就可以了 但是9.0以后 就不行了 需要在AppOpsManager.java中给与权限 接下来看下...
  • 首先的问题是:Android “读取已安装应用列表”需要申请权限吗? 这里我先公布下答案:不需要 一个app无非实现一个团队或个人的商业价值和潜在可能,要是规模大的app,这种特征就非常明显。简而言之,这种权限请求...
  • Android 新版本的出现 ,适配Android8.0未知来源应用安装权限处理 1、在清单文件中增加请求安装权限 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> private void ...
  • 根据Cybernews的说法这些应用会寻求多项权限,而多数权限应用本身功能并不相关。其实在国内这类软件也并不缺乏,他们通常会要求我们授权各种各样的手机权限,以便窥窃我们手机中的隐私。例如在浏览器中搜索“手...
  • Android8.0 允许安装未知来源权限 适配步骤 步骤一.在AndroidManifest.xml中增加请求安装权限 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 步骤二.判断是否已经...
  • 对于应用程序请求的“permissions”可以有几种处理方式:如自动允许权限,通过用户提示或者证书来允许或禁止该权限应用程序需要的“permissions”在程序中静态声明,在程序安装时被系统知晓,并不会再改变。  ...
  • 1、在AndroidManifest.xml 里配置安装权限 如下代码:2、 在Application 配置如下代码//适配安卓8.0、9.0升级安装应用权限 ,请求权限允许安装未知应用权限public void allowUnKnowSrc(Context context){try {// ...
  • 接到产品经理的预研需求,说希望获取用户已安装应用列表。这个问题应该不难,只要是要把相关的知识点整理和验证一下。对于获取用户已安装应用列表,我个人是很熟悉的,因为我的华为手机上,手机管家天天会在通知栏弹...
  • diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index c58b91e39d0..83284fb0b6d 100644 --- a/core/java/android/app/AppOpsManager.java ...
  • 安卓手机在安装软件的时候,总是会要求获取各种权限,除了一些必要权限外,有时还会索要一些敏感权限,如:电话、联系人等权限。工信部也在去年,展开了一次大规模的整顿,,现在很多软件拒绝了权限,也是可以使用的...
  • Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限 以前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知来源的应用都可以被安装。 ...
  • 允许其他应用启动您的 activity

    千次阅读 2021-06-03 12:58:02
    如果您的应用可以执行对另一个应用可能有用的操作,您的应用应通过在 activity 中指定适当的 intent 过滤器,准备好响应操作请求。例如,如果您构建一款...当您的应用安装在设备上时,系统会识别您的 intent 过滤器...
  • 由于Android M 更新了应用运行时权限的特性。 diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index...
  • Android-读取已安装应用列表

    千次阅读 2021-06-03 08:25:26
    title: Android-读取已安装应用列表date: 2019-12-02 11:54:...Android 读取已安装应用列表需要申请权限吗?Android 如何完整的获取到用户已安装应用列表为什么安卓的APP都要读取手机中已安装应用列表结合上述三篇...
  • iOS 10 不提示「是否允许应用访问数据」,导致应用无法使用的解决方案 关键点总结: 只有iOS 10以上、国行机型、有蜂窝网络功能的设备存在这个授权问题,WiFi版的iPad没有这个问题; 由于授权框是在有网络操作时才弹...
  • Android8.0未知来源应用安装权限

    千次阅读 2019-06-01 11:40:21
    Android8.0的诸多新特性中有一个非常重要的特性:未知来源应用权限(危险权限) android6.0到android8.0之前安装未知来源应用的时候一般会弹出一个弹窗让用户去设置允许还是拒绝,并且设置为允许之后,所有的未知...
  • Win11禁用后台应用权限的方法 1、打开开始菜单,点击右上方的“所有应用”。 2、进入应用列表当中,找到需要设置应用,选择之后右键点击,弹出来的菜单中依次点击“更多”—“应用设置”。 3、现在进入到应用...
  • 背景:很多APP有强制更新功能,不更新就退出app,但是permission_handler 并没有提供未知来源的判断权限,而使用install_plugin进行安装,则会直接弹出允许未知安装应用,中间缺少判断是否可以安装权限。...
  • Android源码 第三方应用普通安装 app权限默认开启

    千次阅读 多人点赞 2018-10-15 19:16:24
    预装应用app的权限默认开启,修改DefaultPermissionGrantPolicy.java。手动安装的第三方app的权限默认开启是修改PackageManagerService.java。在grantPermissionsLpw函数中添加如下代码 if(pkg.packageName....
  • Mac M1 10.15+开启允许安装任何来源

    千次阅读 2021-06-19 15:15:37
    允许任何来源” 这个开启和因特尔芯片的有些差异化; 姿势 因特尔芯片 没有带加密芯片的,一般执行下面就出来了 打开终端,以管理员(sudo特权)执行命令 sudo spctl --master-disable 输入电脑开机密码,...
  • 尝试安装Microsoft签名的ClickOnce应用程序时,会显示一条错误消息“您的管理员已阻止此应用程序,因为它可能会对您的计算机造成安全风险”和“您的安全设置不允许安装应用程序你的电脑”。 作为设置所述策略的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 439,704
精华内容 175,881
关键字:

如何关闭允许安装应用权限

友情链接: acdefasda.rar