Android 6.0 以上版本提示“检测到屏幕叠加层”的问题,规避方法

android 6.0 检测到屏幕叠加层的问题,是google针对用户安全的机制。

但是此机制很影响用户的体验感。


在fragment的规避方法是,安装第三应用。如果存在SYSTEM_ALERT_WINDOW 权限。默认关闭此应用的此权限。


在PMS中:

                case POST_INSTALL: {
                    if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);
                    PostInstallData data = mRunningInstalls.get(msg.arg1);
                    mRunningInstalls.delete(msg.arg1);
                    boolean deleteOld = false;


                    if (data != null) {
                        InstallArgs args = data.args;
                        PackageInstalledInfo res = data.res;


                        if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {
                            final String packageName = res.pkg.applicationInfo.packageName;
                            res.removedInfo.sendBroadcast(false, true, false);
                            Bundle extras = new Bundle(1);
                            extras.putInt(Intent.EXTRA_UID, res.uid);


                            // Now that we successfully installed the package, grant runtime
                            // permissions if requested before broadcasting the install.
                            if ((args.installFlags
                                    & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0) {
                                grantRequestedRuntimePermissions(res.pkg, args.user.getIdentifier(),
                                        args.installGrantPermissions);
                            }


                            // Determine the set of users who are adding this
                            // package for the first time vs. those who are seeing
                            // an update.
                            int[] firstUsers;
                            int[] updateUsers = new int[0];
                            if (res.origUsers == null || res.origUsers.length == 0) {
                                firstUsers = res.newUsers;
                            } else {
                                firstUsers = new int[0];
                                for (int i=0; i                                     int user = res.newUsers[i];
                                    boolean isNew = true;
                                    for (int j=0; j                                         if (res.origUsers[j] == user) {
                                            isNew = false;
                                            break;
                                        }
                                    }
                                    if (isNew) {
                                        int[] newFirst = new int[firstUsers.length+1];
                                        System.arraycopy(firstUsers, 0, newFirst, 0,
                                                firstUsers.length);
                                        newFirst[firstUsers.length] = user;
                                        firstUsers = newFirst;
                                    } else {
                                        int[] newUpdate = new int[updateUsers.length+1];
                                        System.arraycopy(updateUsers, 0, newUpdate, 0,
                                                updateUsers.length);
                                        newUpdate[updateUsers.length] = user;
                                        updateUsers = newUpdate;
                                    }
                                }
                            }
                            sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
                                    packageName, extras, null, null, firstUsers);
                            final boolean update = res.removedInfo.removedPackage != null;
                            if (update) {
                                extras.putBoolean(Intent.EXTRA_REPLACING, true);
                            }
                            sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED,
                                    packageName, extras, null, null, updateUsers);
                            if (update) {
                                sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED,
                                        packageName, extras, null, null, updateUsers);
                                sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED,
                                        null, null, packageName, null, updateUsers);


                                // treat asec-hosted packages like removable media on upgrade
                                /* SPRD: support double sdcard
                                 * Add support for install apk to internal sdcard @{
                                 * @orig
                                 * if (res.pkg.isForwardLocked() || isExternal(res.pkg)) {
                                 */
                                if (res.pkg.isForwardLocked() || isExternal(res.pkg) || isInternalSd(res.pkg)) {
                                     /* @} */
                                    if (DEBUG_INSTALL) {
                                        Slog.i(TAG, "upgrading pkg " + res.pkg
                                                + " is ASEC-hosted -> AVAILABLE");
                                    }
                                    int[] uidArray = new int[] { res.pkg.applicationInfo.uid };
                                    ArrayList pkgList = new ArrayList(1);
                                    pkgList.add(packageName);
                                    sendResourcesChangedBroadcast(true, true,
                                            pkgList,uidArray, null);
                                }
                            }
                            if (res.removedInfo.args != null) {
                                // Remove the replaced package's older resources safely now
                                deleteOld = true;
                            }


                            // If this app is a browser and it's newly-installed for some
                            // users, clear any default-browser state in those users
                            if (firstUsers.length > 0) {
                                // the app's nature doesn't depend on the user, so we can just
                                // check its browser nature in any user and generalize.
                                if (packageIsBrowser(packageName, firstUsers[0])) {
                                    synchronized (mPackages) {
                                        for (int userId : firstUsers) {
                                            mSettings.setDefaultBrowserPackageNameLPw(null, userId);
                                        }
                                    }
                                }
                            }
                            // Log current value of "unknown sources" setting
                            EventLog.writeEvent(EventLogTags.UNKNOWN_SOURCES_ENABLED,
                                getUnknownSourcesSettings());
                            
                        /*SUN:jicong.wang modify for system alert window off start {@*/
                        String[] pkgs = getAppOpPermissionPackages(Manifest.permission.SYSTEM_ALERT_WINDOW);
                        for (String pkg : pkgs) {
                            //Log.d(TAG,"SUN:jicong.wang system alert window permission pkg is "+pkg);
                            if (pkg.equals(packageName)) {
                                 Log.d(TAG,"SUN:jicong.wang system alert window permission off pkg is "+pkg);
                                AppOpsManager appops = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
                                appops.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, res.pkg.applicationInfo.uid, packageName, AppOpsManager.MODE_ERRORED);                                
                            }
                        }
                        /*SUN:jicong.wang modify for system alert window off end @}*/
                        }

你可能感兴趣的:(Android,android系统)