适配Android 13:悬浮窗与通知权限请求问题求助
适配Android 13的两个问题解决方案
一、替换废弃的startActivityForResult实现悬浮窗权限请求
Android 11起官方推荐用Activity Result API替代旧的startActivityForResult和onActivityResult,核心是通过ActivityResultLauncher注册回调,无需重写生命周期方法,逻辑更清晰。
修改后的完整代码:
// 1. 在Activity类中声明全局的ActivityResultLauncher private ActivityResultLauncher<Intent> overlayPermissionLauncher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 2. 初始化Launcher,定义权限回调逻辑 overlayPermissionLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 权限设置页返回后,直接重新检查权限状态即可 if (!Settings.canDrawOverlays(this)) { errorToastDrawOverOtherApp(); finish(); } }); } // 3. 修改权限请求方法 private void askForSystemOverlayPermission() { if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); // 用Launcher启动权限设置页面 overlayPermissionLauncher.launch(intent); } }
关键说明:
- 不需要再重写
onActivityResult,所有结果处理逻辑都封装在registerForActivityResult的回调里 - 悬浮窗权限设置页不会返回明确的
resultCode,所以直接重新检查权限状态是最可靠的方式
二、通知权限的检查时机问题
关于POST_NOTIFICATIONS权限的检查,给出明确结论和实践建议:
- 每次发送通知前都应该检查:用户可能在应用运行期间随时去系统设置关闭通知权限,如果不检查直接调用
notify(),会抛出SecurityException导致崩溃。 - 启动时提前请求权限:在主Activity启动时先检查并请求通知权限,后续发送通知时的检查只是快速判断(不会重复弹出请求弹窗),避免频繁打扰用户。
- 替代方案:捕获异常:如果不想每次检查,也可以在调用
notify()时捕获SecurityException,此时再引导用户去设置开启权限,但这种方式不如主动检查友好。
推荐实践代码:
public void sendNotification(int notificationID, Notification notification) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { // 权限未授予,可在这里引导用户跳转到设置页,或者做静默处理 return; } notificationManager.notify(notificationID, notification); }
内容的提问来源于stack exchange,提问作者zaxunobi
相关产品推荐
相关产品推荐

