android - GCMBroadcastReceiver 缺少 list 中声明的​​ WAKE_LOCK 权限

标签 android android-manifest google-cloud-messaging android-permissions

我已经尽可能地按照 Google 的示例实现了 GCM,但是默认的 GCMBroadcastReceiver 因缺少 WAKE_LOCK 权限而抛出 SecurityException。不过,我在我的 list 中需要它,所以 AFAIK 它应该在运行时具有该权限。这是我的 list 的相关部分:

<permission
    android:name="PACKAGENAME.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="PACKAGENAME.permission.C2D_MESSAGE" />

<permission
    android:name="android.permission.WAKE_LOCK"
    android:protectionLevel="signatureOrSystem" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

<application
    android:name=".App"
    android:icon="@drawable/app"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar" >
    <service android:name=".GCMIntentService" />

    <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="PACKAGENAME" />
        </intent-filter>
    </receiver>

我在日志文件中看到的异常是:

07-09 13:32:58.238: E/AndroidRuntime(2723): java.lang.RuntimeException: Unable to start receiver com.google.android.gcm.GCMBroadcastReceiver: java.lang.SecurityException: Neither user 10072 nor current process has android.permission.WAKE_LOCK.
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2126)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.Looper.loop(Looper.java:137)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.app.ActivityThread.main(ActivityThread.java:4424)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at java.lang.reflect.Method.invokeNative(Native Method)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at java.lang.reflect.Method.invoke(Method.java:511)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at dalvik.system.NativeStart.main(Native Method)
07-09 13:32:58.238: E/AndroidRuntime(2723): Caused by: java.lang.SecurityException: Neither user 10072 nor current process has android.permission.WAKE_LOCK.
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.Parcel.readException(Parcel.java:1327)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.Parcel.readException(Parcel.java:1281)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:279)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.PowerManager$WakeLock.acquireLocked(PowerManager.java:285)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.os.PowerManager$WakeLock.acquire(PowerManager.java:264)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at com.google.android.gcm.GCMBaseIntentService.runIntentInService(GCMBaseIntentService.java:235)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at com.google.android.gcm.GCMBroadcastReceiver.onReceive(GCMBroadcastReceiver.java:46)
07-09 13:32:58.238: E/AndroidRuntime(2723):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2119)
07-09 13:32:58.238: E/AndroidRuntime(2723):     ... 10 more

最佳答案

我没有在注册接收消息的 Activity 的 onDestroy() 方法中调用 GCMRegistrar.onDestroy()。由于某种原因导致它提示没有 WAKE_LOCK,但只在 4.0.4 设备上。

关于android - GCMBroadcastReceiver 缺少 list 中声明的​​ WAKE_LOCK 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401264/

相关文章:

java - 尽管在 list 上设置了互联网权限,但我无法在 Android 设备上获取我的 IP

android - 处理 GCM 发送的 Intent 时出错

android - 谷歌云消息注册失败

android - 为什么我取消的协程作业仍在运行?

android - 更新 Android 源代码中的 .mk 和 .xml 文件

android - 选项菜单操作栏

android - 如何将权限添加到 AndroidManifest.xml 以进行测试

java - 我运行应用程序时强制关闭?无法启动应用程序 Activity

android - 部署到 App Engine 问题 - 您必须登录才能执行此操作

android - 如何声明一个 TextView 变量以便我可以在任何地方使用它?