GCM无法唤醒设备

12

我正在开发一个GCM应用程序。当设备不处于空闲状态(即通过按下电源按钮进行睡眠)时,一切正常。然而,当设备处于空闲状态时发送消息时,设备不会被唤醒。

我已经完成了以下步骤:

  1. 确认服务器应用程序中 delay_while_idle 未设置为 true
  2. 为每个消息使用不同的折叠键
  3. 多次重新启动设备
  4. 尝试完全从服务器端省略 delay_while_idle - 没有任何效果

我在针对 Android 2.2 API 级别 8(最低版本),在运行 Android 2.3.6 的实际设备上进行测试。

设备正在使用 Wi-Fi,没有 SIM 卡 - 但在运行和非空闲时仍可以接收消息。

这是客户端清单权限部分:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission
    android:name="com.tranwall.sdk.device.android.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="basePackage.android.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"  />           
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.INTERNET" /> 

提前感谢任何帮助。

3个回答

4

仅在清单文件中出现问题。请确保以下内容是清单文件GCM的内容。

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

<uses-permission android:name="packagename.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application>
    <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>
     <service android:name=".GCMIntentService" android:enabled="true" />
</application>

嗨koti,我有类似的广播接收器和意图服务设置 - 我只发布了清单中的权限部分。当设备不空闲时,客户端应用程序可以完美地工作。从日志中可以看出,即使在空闲时也收到了消息 - 唯一的问题是传入的推送消息无法唤醒设备。 - Will777
在空闲模式下,如果你收到了消息,这意味着它正在调用服务中的 onMessage() 方法,你可以在其中编写一些唤醒代码,该代码在此帖子中 https://dev59.com/EFTTa4cB1Zd3GeqPxPbA 中提供。 - koti
谢谢,我会尝试这样做的 - 我只是认为GCM客户端库会在消息到达时唤醒设备。 - Will777
我已经按照https://dev59.com/zGw15IYBdhLWcg3wCnUn?rq=1中所描述的实现了唤醒锁定机制 - 它有效。当推送消息到达时,手机现在将会被唤醒。我在接收器的onMessage中获取了锁定。 - Will777

4

delayWhileIdle=false

delay_while_idle:如果包含此参数,则表示如果设备处于空闲状态,消息不应立即发送。
服务器将等待设备变为活动状态,然后仅发送每个*collapse_key*值的最后一条消息。可选项,默认值为false,必须是一个JSON布尔值。


2
服务器端需要这段代码:
    builder.delayWhileIdle(false);

这意味着在深度睡眠中不会唤醒手机,但可以接收消息。当用户唤醒手机时,将生成新的 GCMIntentService 意图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接