为什么我会收到“权限拒绝:不允许发送广播com.motorola.intent.SYSTEM_DIALOG_POPUP”?

时间:2016-02-23 14:47:55

标签: android android-permissions motorola

背景

我们有一个非常大且非常受欢迎的应用程序,具有相当多的权限。

问题

似乎仅在摩托罗拉设备(XT1254,XT1585,XT1565),Android 5.1和5.1.1上,我们遇到了这类崩溃:

Fatal Exception: java.lang.SecurityException: Permission Denial: not allowed to send 
broadcast com.motorola.intent.SYSTEM_DIALOG_POPUP from pid=15407, uid=10164
       at android.os.Parcel.readException(Parcel.java:1546)
       at android.os.Parcel.readException(Parcel.java:1499)
       at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:2864)
       at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1510)
       at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:382)
       at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:382)
       at android.app.Dialog$2.run(Dialog.java:316)
       at android.os.Handler.handleCallback(Handler.java:746)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5356)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

上述统计数据是使用Crashlytics收集的。

不确定是否是因为这个,但应用程序的权限之一是“SYSTEM_ALERT_WINDOW”,以便能够在其他应用程序之上显示内容。

事情是,这个错误似乎是因为摩托罗拉的代码本身,我在互联网上找不到任何关于它的信息。

我尝试了什么

除了在互联网上搜索此例外,我还试图找到如何联系摩托罗拉本身,包括寻找开发者论坛,但我没有这样做。

我也试过在Android的小组上发帖:

https://code.google.com/p/android/issues/detail?id=201631

问题

在这种情况下可以做些什么?

为什么会发生?是因为许可吗?有解决方法吗?

1 个答案:

答案 0 :(得分:0)

嗨,实际上,当我们构建一个在其他应用程序之上显示笔记的应用程序时,我和我的团队成员面临着完全相同的问题。

经过长时间的研究后,我们发现“SYSTEM_ALERT_WINDOW”权限已获得签名许可,并且由于不让Lollipop 5.1显示弹出窗口而导致问题

作为解决方法,我们需要明确要求用户通过执行此操作为您的应用授予叠加权限。

public void checkOverlayPermission(){
    if(!Settings.canDrawOverlays(this)){
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                Uri.parse("package:"+getPackageName()));
        startActivityForResult(intent, ApplicationConstants.OVERLAY_PERMISSION);
    }
}

希望这有帮助