悬浮窗——判断及跳转(包含OPPO 5.1 系统等)

本文介绍在Android中如何动态检查悬浮窗权限状态,并提供两种不同方式引导用户授权的方法。此外,还特别针对OPPO5.1系统的浮窗权限不兼容问题提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限

1.在AndroidManifest.xml中申请权限

<!-- 要获取CompatModeWrapper,首先得在应用程序的AndroidManifest.xml文件中添加权限 -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2.判断悬浮窗权限是否开启

 public static boolean checkFloatPermission(Context context) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)

return true;

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

try {

Class cls = Class.forName("android.content.Context");

Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");

declaredField.setAccessible(true);

Object obj = declaredField.get(cls);

if (!(obj instanceof String)) {

return false;

}

String str2 = (String) obj;

obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);

cls = Class.forName("android.app.AppOpsManager");

Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");

declaredField2.setAccessible(true);

Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);

int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());

return result == declaredField2.getInt(cls);

} catch (Exception e) {

return false;

}

} else {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);

if (appOpsMgr == null)

return false;

int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context

.getPackageName());

return mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;

} else {

return Settings.canDrawOverlays(context);

}

}

}

3.使用

 String androidSDK = Build.VERSION.SDK;

if(Integer.parseInt(androidSDK)>=23&&!Settings.canDrawOverlays(LoginActivity.this)){

Intent intent2 = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

startActivityForResult(intent2,1);

}


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);


if (requestCode == 1){

if (PermissionUtils.checkFloatPermission(this)){

System.out.println("悬浮窗权限申请成功...");

}else{

System.out.println("悬浮窗权限申请失败...");

finish();

}

}

}

4.同一功能的两种显示效果

  1. 第一种:会进入到悬浮窗权限应用列表

  2. 使用以下代码,会进入到悬浮窗权限的列表,列表中是手机中需要悬浮窗权限的应用列表,你需要在此列表中找到自己的应用,然后点进去,才可以打开悬浮窗权限

  3. Intent intent2 = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

  4. startActivity(intent2);

  5.  
  6. 第二种:直接进入到自己应用的悬浮窗权限开启界面

  7. 使用以下代码,则不会到上述所说的应用列表,而是直接进入到自己应用的悬浮窗权限开启界面

  8. Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

  9. intent.setData(Uri.parse("package:" + getPackageName()));

  10. startActivity(intent);

  11.  
  12.  
  13. Build.VERSION.SDK_INT>= Build.VERSION_CODES.O//8.0以上,建议用第一种

  14.  
  15. Build.VERSION.SDK_INT>= Build.VERSION_CODES.M//6.0-8.0,建议用第二种

  16.  
  17.  
  18. 参考网址:https://blog.csdn.net/eyishion/article/details/82787310

参考网址:https://blog.csdn.net/lovedou0816/article/details/79253710

https://blog.csdn.net/aidou1314/article/details/88422007

第一篇《完》

---------------------------------------------------分割线-----------------------------------------------------------------

第二篇《开始》

Android 解决OPPO 5.1 浮窗权限不兼容问题

OPPO 5.1 浮窗权限开启并不像大多Android机那样在手机设置中,而是在OPPO的系统软件-手机安全中心-中,

故跳转到权限界面,需要做特殊处理。

1.判断是否为 OPPO 5.1 系统

if(Utils.isOppo() && Utils.getAndroidVersion().equals("5.1")) {
        compat = new OppoCompatImpl();
      } 
2.通过包名、Activity名跳转到指定权限界面

public class OppoCompatImpl extends BelowApi23CompatImpl {
    @Override
    public boolean isSupported() {
        return true;
    }
 
    @Override
    public boolean apply(Context context) {
        try {
            Intent intent = new Intent(Intent.ACTION_MAIN);
            ComponentName componentName = new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.floatwindow.FloatWindowListActivity");
//                    ComponentName componentName = new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.sysfloatwindow.FloatWindowListActivity");// oppo A37型号,能跳转到手机管家悬浮窗设置页
//                    ComponentName componentName = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");
            intent.setComponent(componentName);
            context.startActivity(intent);
            return true;
        } catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }
}

————————————————
版权声明:本文为CSDN博主「Yurja_Lee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38193813/article/details/80621459

 

如果有不当的地方,欢迎指正。感谢以上博主,谢谢!

如有侵权等不妥的地方,请各位博主评论区留言,本人看到会立刻处理。再次感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值