恐怕是个坏消息。
你可能已经知道,这需要获取SYSTEM_ALERT_WINDOW权限。
自从安卓M版以来,Google已经开始限制这个权限以减少混乱。这个权限有点不寻常的地方在于,它需要用户进入实际的设置屏幕普通的Android M权限流程对此无效。引用API的话:
如果应用程序针对API级别23或更高版本,则应用程序用户必须通过权限管理屏幕显式授予此权限
您可以使用Settings类检查是否已经拥有该权限,当未拥有时,您需要通过意图解释并引导用户到相关的设置屏幕。
Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);
这只会影响运行23+的设备,因为旧设备应该会自动获取权限,但不要仅依赖于SDK_INT的检查,而是依赖canDrawOverlays,因为一些棉花糖版本之前存在异常情况。
我也遇到了同样的问题,需要在设置中启用它,但在清单文件中添加权限后,它完美地工作了。
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
测试过版本9。
我曾经也遇到过这个问题并找到了一个解决方法。 (在我的情况下,我使用的是OneSignal React-Native SDK)
解决方案是创建一个“类别”(在 OneSignal 控制台上),并将其设置为“紧急”重要性:)
之后,当您发送推送时,必须引用此类别的 channel_id。 文档:https://documentation.onesignal.com/docs/android-notification-categories