无法获取NotificationListenerService的权限BIND_NOTIFICATION_LISTENER_SERVICE

时间:2017-06-16 20:45:00

标签: android

我创建了一个应用程序并添加了一个扩展`NotificationListenerService'的java类。 一切都应该工作正常,但我无法获得BIND_NOTIFICATION_LISTENER_SERVICE的许可。 我在清单上添加了它,但当我通过以下方式检查权限时:

        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE)
            != PackageManager.PERMISSION_GRANTED)
    {
        Log.d(TAG, "permission denied");
    }
    else
        Log.d(TAG, "permission granted");

但我一直拒绝接受许可。我知道此许可不是“危险许可”,因此我不必向用户索取。 在清单中我声明了这一点:

        <service android:name=".PcNotification"
        android:label="PCNotificationService"
        android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
        <intent-filter>
            <action android:name="android.service.notification.NotificationListenerService" />
        </intent-filter>
    </service>

它仍然不起作用。 我还实现了函数onListenerConnected,但它从未调用过,因此这意味着我的服务永远不会连接到通知管理器,可能是因为我没有权限BIND_NOTIFICATION_LISTENER_SERVICE

我只是想知道如何将此权限授予我的应用。

3 个答案:

答案 0 :(得分:2)

  

我无法获得BIND_NOTIFICATION_LISTENER_SERVICE

的许可

您无需请求该权限。您需要使用该权限保护您的服务。您是通过<service>属性在android:permission元素中执行此操作。

  

我知道此许可不是危险许可&#34;所以我不必向用户索要。

然后摆脱从用户请求它的代码。这是不必要的,它将无法工作。

答案 1 :(得分:0)

这应该是原始问题的字面答案。 然而,如果你需要下面的方法,你就误解了这些服务的使用(就像我一样)。您不应该自己启动通知监听器,您应该只测试您的服务是否正在运行,如果没有,那么您已经知道该权限未被授予,您可以将用户指向android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS的首选项面板。

将此方法添加到NotificationListenerClass中,如果授予权限,则返回true,否则返回false:

public Boolean VerifyNotificationPermission() {
    String theList = android.provider.Settings.Secure.getString(getContentResolver(), "enabled_notification_listeners");
    String[] theListList = theList.split(":");
    String me = (new ComponentName(this, YourNotificationListenerClass.class)).flattenToString();
    for ( String next : theListList ) {
        if ( me.equals(next) ) return true;
    }
    return false;
}

字符串&#34; enabled_notification_listeners&#34;似乎是在Settings.Secure.ENABLED_NOTIFICATION_LISTENERS的引擎盖下定义的,但是我无法解决这个问题,因此我使用了可能不太可维护的文字字符串。如果有人知道如何通过它的参考获得它,请添加/编辑!

答案 2 :(得分:0)

此特定权限必须由用户在 android 设置中手动授予,之后您的服务将在您将权限绑定到 AndroidManifest.xml 中的服务时执行: >

<service android:name=".PcNotification"
    android:label="PCNotificationService"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

问题是大多数用户不知道在哪里授予此权限(例如在 android 设置中),因此您可以通过以下方式为他们打开它:

startActivity(new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"));

您可以在用户与您的应用交互时运行此程序 - 例如点击按钮 - 并且最好说明您为什么需要此权限。

<块引用>

我觉得特别好的是有一张带有说明的卡片和一个用于打开设置的按钮,以便用户可以启用。