精华内容
下载资源
问答
  • 后台弹出界面权限踩坑

    万次阅读 2020-06-09 18:06:23
    后台弹出界面权限踩坑    最近在处理MIUI系统中应用后台弹出界面权限时踩了一些坑,总结下经验,方便遇到同样问题的人。 后台弹出界面权限    Android系统/应用自带了很多权限,为了...

    后台弹出界面权限踩坑

       最近在处理MIUI系统中应用后台弹出界面权限时踩了一些坑,总结下经验,方便遇到同样问题的人。

    后台弹出界面权限

       Android系统/应用自带了很多权限,为了限制应用的一些行为。但“魔高一尺,道高一丈”,现有的一些权限其实不能完全限制一些应用的行为,所以一些产商会在权限管理中自行添加相关的权限。

    在这里插入图片描述

       上图中,后台弹出界面权限就是MIUI系统自行添加的权限。顾名思义其作用就是限制应用在后台弹出界面的权利,默认关闭,需手动赋予该权限应用才能在后台拉起Activity等界面。

       其在系统中的定义如下

    //声明为 hide,即应用无法通过hook来修改该权限。
        /** @hide Background start Activity */
           public static final int OP_BACKGROUND_START_ACTIVITY = 10021;
    

       查看了下源码,其设置的时机是在PermissionConfiguration.java被加载时,在其内部的static方法块中进行设置以及初始化的。

     {
     // Background start Activity
    Permission permission = new Permission(PermissionManager.PERM_ID_BACKGROUND_START_ACTIVITY,
               R.string.HIPS_Perm_background_start_activity,
               R.string.HIPS_Perm_background_start_activity_Desc,
               PermissionManager.GROUP_SETTINGS,
                PermissionManager.ACTION_ACCEPT, PermissionManager.ACTION_ACCEPT);
      permission.setOps(AppOpsManager.OP_BACKGROUND_START_ACTIVITY);
        permission.addFlag(Permission.FLAG_ALWAY_ADD);
       permission.addFlag(Permission.FLAG_NO_ASK);
       sPermissions.add(permission);
    }
    

       MIUI在系统中专门使用ExtraActivityManagerService来控制这些权限的行为。当你应用尝试在后台打开一个界面并且没有授予该权限时,系统就会打印以下日志,并且拦截该行为。

    2020-06-09 16:22:42.379 31608-31608/com.kuaiest.video I/Timeline: Timeline: Activity_launch_request time:234147729 intent:Intent { flg=0x10800000 cmp=com.kuaiest.video/.feature.screenlock.TesttAcitivity }
    2020-06-09 16:22:42.402 1472-3398/? I/ActivityManager: START u0 {flg=0x10800000 cmp=com.kuaiest.video/.feature.screenlock.TesttAcitivity} from uid 10487
    2020-06-09 16:22:42.403 1472-3398/? D/com.android.server.am.ExtraActivityManagerService: MIUILOG- Permission Denied Activity : Intent { flg=0x10800000 cmp=com.kuaiest.video/.feature.screenlock.TesttAcitivity } pkg : com.kuaiest.video uid : 10487 tuid : 10052
    

    绕过方案

       为了绕过该权限,尝试了几种方案如下:

    1.前台服务方式

       开始想到这个权限主要是针对后台应用,于是想着在恰当的时机启动个前台服务,然后在前台服务中进行界面弹出操作,实现如下。

        //启动服务
        if (!TestFService.serviceIsLive) {
            // Android 8.0使用startForegroundService在前台启动新服务
            mForegroundService = new Intent(this, TestFService.class);
            mForegroundService.putExtra("Foreground", "This is a foreground service.");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                startForegroundService(mForegroundService);
            } else {
                startService(mForegroundService);
            }
        } else {
            Toast.makeText(this, "前台服务正在运行中...", Toast.LENGTH_SHORT).show();
        }
        
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            LogUtils.d(TAG, "onStartCommand");
            // 标记服务启动
            TestFService.serviceIsLive = true;
            // 数据获取
            String data = intent.getStringExtra("Foreground");
            Toast.makeText(this, data, Toast.LENGTH_SHORT).show();
            Intent intent1 = new Intent(this, TesttAcitivity.class);
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
            startActivity(intent1);
            return super.onStartCommand(intent, flags, startId);
        }
    

       尝试无果,该方式无法绕过这个权限。

    2.引导用户开启方式

       这种方式是网上一些笔者分享的经验,但这个方法只是提示用户去权限管理中开启权限,而不是绕过权限,所以该方法也不是很好的解决方案。如果有需要可以看下网上这个方法的介绍——后台弹出界面权限适配方案

    3.堆栈调度方式

       这个方法是一个取巧的办法,能够让应用在一些场景下绕过该权限的限制,其实就是利用ams获取到当前后台应用的堆栈,然后将堆栈强行推到前台使应用恢复到前台,从而绕过权限限制弹出对应的界面,具体看以下方法描述。

        private  void isRunningForegroundToApp(Context context, final Class Class) {
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            //利用系统方法获取当前Task堆栈, 数目可按实际情况来规划,这里只是演示
            List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(20);
    
           
            for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
                //遍历找到本应用的 task,并将它切换到前台
                if (taskInfo.baseActivity.getPackageName().equals(context.getPackageName())) {
                    Log.d(TAG, "timerTask  pid " + taskInfo.id);
                    Log.d(TAG, "timerTask  processName " + taskInfo.topActivity.getPackageName());
                    Log.d(TAG, "timerTask  getPackageName " + context.getPackageName());
                    activityManager.moveTaskToFront(taskInfo.id, ActivityManager.MOVE_TASK_WITH_HOME);
                    Intent intent = new Intent(context, Class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                    context.startActivity(intent);
                    break;
                }
            }
        }
    

       目前尝试的方法挺多的,只有上述的几种方式靠谱些,如果有新的方法可以提出来交流,交流。

    展开全文
  • 小米手机有个特殊的权限,"后台弹出界面(允许应用在后台弹出界面)",默认是拒绝的,如下图所示. OK,故事就此展开. 允许后台弹出界面 顾名思义,这个权限意思就是说,我应用在后台了,如果没有开启这个权限...

    前言

     小米手机有个特殊的权限,"后台弹出界面(允许应用在后台弹出界面)",默认是拒绝的,如下图所示.

     

    OK,故事就此展开.

     

    允许后台弹出界面

     

      顾名思义,这个权限意思就是说,我应用在后台了,如果没有开启这个权限,通过Intent启动Activity的方法将不会启动界面成功,并且小米会输出以下日志.

    "com.android.server.am.ExtraActivityManagerService: MIUILOG- Permission Denied Activity".

     真是很坑阿,米哥,要玩死我们开发者阿,就不能遵从点谷歌规范,完善开发生态吗.

    看到有些博客竟然这样说:

     米哥,想挣钱挣疯了? 多听听开发者的声音,遵循谷歌规范,加油,奥力给!!!

     

    解决方案

     

     经测试,华为手机没有这个权限,目前vivo/oppo/小米手机有这个“后台弹出界面”权限.

    1.既然这样,得想办法绕过这个后台启动机制。一般来说,从后台启动Activity的时候,Activity当中会启动一个Dialog来提示用户,ok,那我直接不启动Activity,直接弹出Dialog不就行了,完美绕过这个机制.

    2.经过我不懈的搜索,我发现了一个方法,测试可用,小米官方提供代码如下:

      

       private boolean isAllowed() {
            AppOpsManager ops = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
            try {
                int op = 10021;
                Method method = ops.getClass().getMethod("checkOpNoThrow", new Class[]{int.class, int.class, String.class});
                Integer result = (Integer) method.invoke(ops, op, Process.myUid(), getPackageName());
                return result == AppOpsManager.MODE_ALLOWED;
    
            } catch (Exception e) {
                Log.e(TAG, "not support");
            }
            return false;
        }

     

    总结

     

      目前采用第一个方案,去合理的绕过这个机制,当然实在不行了,第二个方法可以做兼容处理.

      米哥,别再折腾米粉开发者了,以后加油,多遵循谷歌规范,多给开发者带来福利,奥利给!!!

     

     

     

    展开全文
  • Android小米、Vivo、Oppo后台弹出界面权限检测背景问题原因检测方法小米:Vivo:判断当前手机厂商:完整代码: 小米、Vivo、Oppo后台弹出界面权限检测 记录一个开发中遇到App退到后台startActivity无法跳转问题 背景...

    小米、Vivo、Oppo后台弹出界面权限检测

    记录一个开发中遇到App退到后台startActivity无法跳转问题

    背景

    公司App需求,从App切到第三方App时,需要在最顶层展示一个“返回”按钮,点击后一键切换回自己App~
    然后用WindowManager撸了一个悬浮框,点击悬浮框时startActivity,华为手机一切正常。

    测了一台小米手机才发现,startActivity调用了不生效并不会跳转~但我确信不是代码问题,肯定是雷布斯又做了什么定制

    问题原因

    度娘了一下才知道,原来小米、vivo等厂商为了不让后台应用乱弹广告,增加了一项“后台弹出界面”的权限,默认是禁止的,小米手机可见:小米关于默认关闭“后台弹出页面”权限的通知

    不得不说出发点是好的,但并没有提供代码申请此权限,甚至连授权权限的页面都各不一样,设置里找半天才能找到这个块设置

    由于我们小团队小项目,也没资格找厂商谈判默认打开,所以只能通过提示引导用户去手动打开~

    但又不能一股脑的就喊用户去设置,有些手机是不需要这个权限的,至少得判断当前是否有这个权限,没权限的时候再喊用户去设置,这就合理多了,然后又开始了一轮度娘~

    检测方法

    直接上代码

    小米:

        private fun isXiaomiBgStartPermissionAllowed(context: Context): Boolean {
            val ops = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
            try {
                val op = 10021
                val method: Method = ops.javaClass.getMethod("checkOpNoThrow", Int::class.javaPrimitiveType, Int::class.javaPrimitiveType, String::class.java)
                val result = method.invoke(ops, op, android.os.Process.myUid(), context.packageName) as Int
                return result == AppOpsManager.MODE_ALLOWED
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return false
        }
    

    Vivo:

        private fun isVivoBgStartPermissionAllowed(context: Context): Boolean {
            return getVivoBgStartPermissionStatus(context) == 0
        }
    
        /**
         * 判断Vivo后台弹出界面状态, 1无权限,0有权限
         * @param context context
         */
        private fun getVivoBgStartPermissionStatus(context: Context): Int {
            val uri: Uri = Uri.parse("content://com.vivo.permissionmanager.provider.permission/start_bg_activity")
            val selection = "pkgname = ?"
            val selectionArgs = arrayOf(context.packageName)
            var state = 1
            try {
                context.contentResolver.query(uri, null, selection, selectionArgs, null)?.use {
                    if (it.moveToFirst()) {
                        state = it.getInt(it.getColumnIndex("currentstate"))
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return state
        }
    

    判断当前手机厂商:

        fun isXiaoMi(): Boolean {
            return checkManufacturer("xiaomi")
        }
    
        fun isOppo(): Boolean {
            return checkManufacturer("oppo")
        }
    
        fun isVivo(): Boolean {
            return checkManufacturer("vivo")
        }
    
        private fun checkManufacturer(manufacturer: String): Boolean {
            return manufacturer.equals(Build.MANUFACTURER, true)
        }
    

    完整代码:

    object RomUtils {
        private val TAG = RomUtils::class.java.simpleName
    
        fun isXiaoMi(): Boolean {
            return checkManufacturer("xiaomi")
        }
    
        fun isOppo(): Boolean {
            return checkManufacturer("oppo")
        }
    
        fun isVivo(): Boolean {
            return checkManufacturer("vivo")
        }
    
        private fun checkManufacturer(manufacturer: String): Boolean {
            return manufacturer.equals(Build.MANUFACTURER, true)
        }
    
        fun isBackgroundStartAllowed(context: Context): Boolean {
            if (isXiaoMi()) {
                return isXiaomiBgStartPermissionAllowed(context)
            }
    
            if (isVivo()) {
                return isVivoBgStartPermissionAllowed(context)
            }
    
            if (isOppo() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                return Settings.canDrawOverlays(context)
            }
            return true
        }
    
    
        private fun isXiaomiBgStartPermissionAllowed(context: Context): Boolean {
            val ops = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
            try {
                val op = 10021
                val method: Method = ops.javaClass.getMethod("checkOpNoThrow", Int::class.javaPrimitiveType, Int::class.javaPrimitiveType, String::class.java)
                val result = method.invoke(ops, op, android.os.Process.myUid(), context.packageName) as Int
                return result == AppOpsManager.MODE_ALLOWED
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return false
        }
    
        private fun isVivoBgStartPermissionAllowed(context: Context): Boolean {
            return getVivoBgStartPermissionStatus(context) == 0
        }
    
        /**
         * 判断Vivo后台弹出界面状态, 1无权限,0有权限
         * @param context context
         */
        private fun getVivoBgStartPermissionStatus(context: Context): Int {
            val uri: Uri = Uri.parse("content://com.vivo.permissionmanager.provider.permission/start_bg_activity")
            val selection = "pkgname = ?"
            val selectionArgs = arrayOf(context.packageName)
            var state = 1
            try {
                context.contentResolver.query(uri, null, selection, selectionArgs, null)?.use {
                    if (it.moveToFirst()) {
                        state = it.getInt(it.getColumnIndex("currentstate"))
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
            return state
        }
    }
    
    展开全文
  • 在前段时间的编程开发中,突然发现一个小坑的地方,其实在Android官方中并没有限制,但是在很多厂商的系统中却做了修改限制,那就是“后台弹出界面权限”最开始发现这个问题,是因为我的悬浮框当应用处于后台时,...

    在前段时间的编程开发中,突然发现一个小坑的地方,其实在Android官方中并没有限制,但是在很多厂商的系统中却做了修改限制,那就是“后台弹出界面权限”

    最开始发现这个问题,是因为我的悬浮框当应用处于后台时,悬浮框所有功能失效,我一开始以为是出了什么bug,后来才发现这是系统的问题,例如小米系统就有这个限制

    为了绕过这个权限,也做过一些处理

    例如:

    通过前台服务的方式启动后台应用

    引导用户打开相应权限

    获取当前堆栈,判断应用是否被打开,如果未被打开则强行将应用提至前台

    经过测试,第一种方法无效。第二种方案是必备的,让用户打开权限自然是最好的,第三种方法则是比较取巧的方法,这里着重讲第三种方案

    先判断我们的界面是否已经被调用到前台

    ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    Listlist = activityManager.getRunningTasks(1);

    if (list != null && list.size() > 0) {

    ComponentName cpn = list.get(0).topActivity;

    Log.e("className",""+cpn.getClassName());

    if (className.equals(cpn.getClassName())) {

    return true;

    }

    }

    然后获取在相应的界面获取activityManager

    val activityManager =

    context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

    最后利用系统的当前的task堆栈

    val taskInfoList: List=

    activityManager.getRunningTasks(20)

    然后循环找到自己有用的task,将其调至强行切换到前台即可

    展开全文
  • 在前段时间的编程开发中,突然发现一个小坑的地方,其实在Android官方中并没有限制,但是在很多厂商的系统中却做了修改限制,那就是“后台弹出界面权限”最开始发现这个问题,是因为我的悬浮框当应用处于后台时,...
  • private boolean canBackgroundStart(Context context) { AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); try { int op = 10021; // >= 23 // ops.checkOpNoThrow...
  • 如 第三方ROM中的 [开机自启动] [后台省电] [后台打开界面] 等 现在, 有办法解决了! 很简单, 原理是通过反射AppOpsManager取得支持的变量, 理论上 华为小米 魅族这些新增的权限都会在这个类里面增加常量值, 我们...
  • 在Application中添加以下代码并调用: private boolean isAllowed() { AppOpsManager ops = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); try { int op = 10021; Method method = ops.getClass...
  • 后台弹出自定义dialog

    2013-08-12 16:33:59
    Android后台弹出自定义dialog 详细描述: http://blog.csdn.net/y_haiyang/article/details/9924869 ====================关注小鱼=================== 新浪微博:http://weibo.com/AwareMissing 腾讯微博:...
  • 后台页面设置页面弹出

    千次阅读 2017-03-28 16:17:39
    Response.Write("<script Language='JavaScript'>window.alert('您没有权限使用此功能!');</script>");//页面提示 Response.Redirect("/index.aspx");//跳转到其他页面
  • 记录在安卓应用中,应用在后台弹出对话框或显示一个view在前台界面上相关方法以及参数,效果。 int windowType 对话框的设置 final AlertDialog dialog = new AlertDialog.Builder(this).setMessage("test ...
  • 调用java后台的接口会传来一个用户名,后台的某个页面弹出“xxx请求权限后台的管理员点击允许后,接口传给调用接口的客户端一个“ok”
  • 后台权限管理系统

    千次阅读 多人点赞 2021-07-31 00:54:00
    CommonAdmin是一个按钮级别权限管理平台,包含企业后台最常用的系统模块,代码简洁,开箱即用。 访问地址:https://gitee.com/caochenlei/common-admin 主要功能 登录功能 部门管理 用户管理 ...
  • layuiAdmin后台框架以及动态权限

    千次阅读 2020-03-09 20:10:18
    alyuiAdmin首页加载权限 // layuimini.init('api/init.json');原项目请求的是这些静态资源 layuimini.init('/permission/initMenu'); init.json格式 所以要从后台定义请求这些数据 特别注意:一定要按照...
  • 后台权限验证

    2017-03-11 12:00:00
    通常我们会遇到这样的情况,当我们点击想要获取网站的某处URL资源的时候,会弹出提醒你要登陆的界面,在这里展示一下可能的一种实现。 框架:struts 设计思路 :1.login.jsp实现登录界面,将表单提交到后台Action...
  • 如果点击跳转新的tab页,同时打开tab页并后台校验,如异常弹出提示信息并关闭tab页; 引入admin.js layui.use([ 'index', 'laydate', 'form','laypage','httpCommon', 'jquery','layer','table','admin'], function...
  • 对于一些应用要求应用没有完全退出的情况下在后台运行时要弹出通知以方便用户进入软件。例如QQ就在退到后台的时候弹出正在运行的提示通知。 初步总结实现这种效果可以有一下三种方式: 1、可以监听onstop()方法...
  • 应用检查后台启动权限方法(小米官方给的)

    千次阅读 热门讨论 2019-09-02 17:16:19
    应用检查后台启动权限的方法如下: public static boolean canBackgroundStart(Context context) { AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); try { ...
  • 由于本人的工作方向偏向于后台,同时也是技术出身转岗产品经理,在设计后台时常会查阅后台的相关资料,但是网上关于这方面的分享也比较少,于是利用空闲时间,把所经历的三家公司所设计过的后台系统进行整理、总结,...
  • 1、在开发中有时会用到全局弹出对话框但必须在manifest中申请权限:带来的问题: 1. 用户在安装应用时会询问用户是否授权问题 2. 同时在小米手机上默认是禁止系统弹出框的,应用中的系统弹出框将不能够弹出 那能不...
  • 睡不着起不来的万先生 的 Android无需权限显示悬浮窗, 兼谈逆向分析app 文中提到,type 为 WindowManager.LayoutParams.TYPE_TOAST 的 WindowManager.LayoutParam 无需权限,即可让 View 显示。 本...
  • 关于出现的异常,可以认为在输出的时候没有包含btnSubmit,可是再提交到后台的时候却有相应的内容,前后不一致,所以 在开启事件校验的情况下.NET抛了异常。 解决办法1: Page_Load(object sender, ...
  • 解答角色、权限、菜单分配功能接口与界面开发中可能遇到的问题。
  • 由于不同的后台管理系统需求多样化,此处所分享的是通用型,对于大多数的后台管理系统逻辑都已足够使用,主要应用于WEB应用程序,如:网站管理后台、CMS、CRM、OA等等。 当然,您也可以对他进一步深度设计,以做出...
  • 9.1 弹出分配权限对话框并请求权限数据 点击按钮弹出分配权限。为分配权限按钮绑定click事件 定义事件: 写分配权限对话框的结构: 在date中定义数据布尔值: api: 9.2 初步配置并使用el-tree树形控件 写出基本...
  • 后台管理系统开发 功能模块:用户登录、权限管理(用户管理、菜单管理、角色管理) 技术应用:SSM框架+Mysql5.7+jsp+前端layui和EasyUI框架 项目工具:Maven+tomcat9.0+jdk1.8+GIT 开发工具:IDEA 测试环境:window7+...
  • 故意弹出的,目的是赚推广费,各种各样的推测都有,引起这种现象的原因可能有很多种,本文我将利用我学过的知识大胆作出以下可能的猜测。  首先请大家放心一般来说这种打开支付宝领红包的行为对财产安全是没有...
  • Tomcat8如何正确进入Manager App和Host Manager页面 基本找到这篇文章的兄弟们应该...tomcat默认并不给我们去权限进入管理后台,所以一开始就是取消权限的状态,那么这个地方我们就需要修改一个配置文件: 文件位置:t
  • 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系列三 (实战篇) 手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板) 手摸手,带你用 vue 撸后台 系列五(v4.0 新...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,115
精华内容 10,446
关键字:

后台弹出页面权限