简体   繁体   English

Android13,SYSTEM_ALERT_WINDOW权限未勾选BroadcastReceiver

[英]Android13, SYSTEM_ALERT_WINDOW permission not checked in BroadcastReceiver

I want to show a floating view when the user gets a phone call or a text message.我想在用户接到电话或短信时显示浮动视图。 But overlay permission check in broadcastReceiver returns false with built apk on Android 13.但是 broadcastReceiver 中的覆盖权限检查返回 false,内置 apk on Android 13。

I use BroadcastReceiver with RxWorker (more than 12) and Service (less than 12) to get a caller information.我使用 BroadcastReceiver 与 RxWorker(大于 12)和 Service(小于 12)来获取调用者信息。 In Worker or Service, when you success to get a information, you call WindowManager.addview(mView).在 Worker 或 Service 中,当你成功获取信息时,你调用 WindowManager.addview(mView)。 When the app is first launched, the user has already granted the permission to draw overlays.当应用程序首次启动时,用户已经授予绘制叠加层的权限。

        <receiver
            android:name=".receiver.PhoneCallReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>

In this receiver, I check SYSTEM_ALERT_WINDOW permission by using Settings.canDrawOverlays(context) .在此接收器中,我使用Settings.canDrawOverlays(context)检查SYSTEM_ALERT_WINDOW权限。 When I run this in Android Studio, it works well.当我在 Android Studio 中运行它时,它运行良好。 However, permission is not checked when built with apk only on Android 13. Returns false even though you have permission.但是,仅在 Android 上使用 apk 构建时,不会检查权限 13. 即使您有权限,也返回 false。 Sometimes, an error occurs when calling addView within Worker even if the permission is correctly confirmed on the broadcast!有时,即使在广播中正确确认权限,在 Worker 中调用 addView 也会出错!

"android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@7c33a48 -- permission denied for window type 2038" “android.view.WindowManager$BadTokenException:无法添加 window android.view.ViewRootImpl$W@7c33a48 - window 类型 2038 的权限被拒绝”

        <receiver
            android:name=".receiver.MessageReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

When receiving a phone call or text message, WindowManager.addView is called within the same worker, but the view is normally displayed when receiving a text message, and there is no permission when receiving a phone call.接到电话或短信时,在同一个worker内调用WindowManager.addView ,但收到短信正常显示视图,接到电话时没有权限。 For your information, I'm testing with Samsung Galaxy S21.供您参考,我正在使用三星 Galaxy S21 进行测试。

Is there any solution?有什么解决办法吗?

Asking permission when a call is received harms the user experience, but I tested it with reference to Fazle Rabbi's answer.在接到电话时请求许可会损害用户体验,但我参考 Fazle Rabbi 的回答对其进行了测试。 Since the context within the broadcast is not an activity context, a separate activity was created to request permission.由于广播中的上下文不是活动上下文,因此创建了一个单独的活动来请求权限。 (The code has been modified. Check to allow permissions with Settings.canDrawOverlays() instead of comparing with result.resultCode.) (代码已被修改。使用 Settings.canDrawOverlays() 检查以允许权限,而不是与 result.resultCode 进行比较。)

@RequiresApi(Build.VERSION_CODES.R)
class PermissionActivity : AppCompatActivity() {

    private val requestOverlayPermission = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) {
        if (Settings.canDrawOverlays(this)) {
            //Permission granted

            /*
            do something
             */
            
        } else {
            //Permission denied
        }

        finish()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_pemission)

        val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
        intent.data = Uri.parse("package:$packageName")
        requestOverlayPermission.launch(intent)
    }
}

In BroadcastReceiver,在BroadcastReceiver,

if (!Settings.canDrawOverlays(ctx)) {
   val i = Intent(ctx,PermissionActivity::class.java)
   i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
   ctx.startActivity(i)

   return
}

Settings.canDrawOverlays returns false and goes to the Permission Request page whenever BroadcastReceiver is called, even if the app's settings confirm that it has overlay privileges. Settings.canDrawOverlays 返回 false 并在调用 BroadcastReceiver 时转到权限请求页面,即使应用程序的设置确认它具有覆盖权限。 In addition, permissions are still disabled on the moved overlay permission request page.此外,移动覆盖权限请求页面上的权限仍然处于禁用状态。

It's really weird.这真的很奇怪。 Funny how it's normal when it's running on Android studio.有趣的是在Android studio上运行时怎么正常。 It is well confirmed that there is also permission.可以肯定的是,也有许可。 This only happens when executed with the built APK On Android 13, The problem seems to occur not only on one particular device.只有在使用构建的 APK 执行时才会发生这种情况 On Android 13,问题似乎不仅发生在一个特定的设备上。 but on most Samsung phones updated with Android 13?但在大多数更新为 Android 13 的三星手机上? Did I miss anything?我错过了什么吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android SYSTEM_ALERT_WINDOW权限 - Android SYSTEM_ALERT_WINDOW permission 如何检查权限在Android Lollipop上授予SYSTEM_ALERT_WINDOW? - How to check permission SYSTEM_ALERT_WINDOW is granted on Android Lollipop? 如何在本机反应中删除 SYSTEM_ALERT_WINDOW android 权限 - How remove SYSTEM_ALERT_WINDOW android permission in react native Android:SYSTEM_ALERT_WINDOW权限保护级别 - Android: SYSTEM_ALERT_WINDOW permission Protection level SYSTEM_ALERT_WINDOW 的运行时权限 - Runtime permission for SYSTEM_ALERT_WINDOW 通过Appop Denial错误授予SYSTEM_ALERT_WINDOW权限后,Android marshmallow - Android marshmallow after granting permission through Appop Denial error for SYSTEM_ALERT_WINDOW permission 如何在我的 android 应用程序中根据请求自动授予 SYSTEM_ALERT_WINDOW 权限? - How do I grant SYSTEM_ALERT_WINDOW permission automatically on request, in my android App? 请求 SYSTEM_ALERT_WINDOW 权限后返回应用程序 - Return to app after requesting SYSTEM_ALERT_WINDOW permission Whatsapp 如何在 Android 11 上获得 SYSTEM_ALERT_WINDOW 权限? - How does Whatsapp get SYSTEM_ALERT_WINDOW permission on Android 11? SYSTEM_ALERT_WINDOW - 如何在 Android 6.0 和 targetSdkVersion 23 上自动获得此权限 - SYSTEM_ALERT_WINDOW - How to get this permission automatically on Android 6.0 and targetSdkVersion 23
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM