android 应用程序根本没有收到 GCM 消息
GCM messages are not received with android app at all
我有一个老问题:我无法使用 android 应用程序接收 GCM 消息。根据服务器日志,它们已成功传送到 GCM 服务器并进一步发送,但我的客户端应用程序似乎没有收到它们。
这是我的清单中与 GCM 相关的片段:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<permission
android:name="my.package.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="my.package.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION" />
<category android:name="my.package" />
</intent-filter>
</receiver>
<service android:name=".GcmIntentService" />
这是我的服务-class GcmIntentService:
public class GcmIntentService extends GcmListenerService {
private String TAG = "myReceiver";
@Override
public void onMessageReceived(String from, Bundle data) {
Log.d(TAG, "message received");//this log is never shown
if (!data.isEmpty()) {
Log.d(TAG, "interesting message receiver");
}
}
}
这是我的项目build.gradle依赖:
classpath 'com.google.gms:google-services:1.3.0-beta1'
我想我忘了添加一些东西,这就是它根本不起作用的原因。我尝试使用 WLAN 和 SIM 卡上网。所以问题不在互联网防火墙中。 Sender API 和 GCM-token 似乎是正确的(它们是从开发者帐户的相应设置中复制和粘贴的)。
提前感谢您的帮助。
编辑:请参阅下面的答案
有些事情是错误的/可能是错误的。你需要主activity.And的gcm注册码中的发件人id你有3次C2D_MESSAGE
权限,这是第一次错误(put.your.package.name
)。第二次是生产阶段正确,但不能用于开发,第三次你有正确的开发权限。
你应该只拥有一次。
确实像@Android 印度建议更改清单中的服务声明。
在清单中进行以下更改
替换以下代码
<service android:name=".GcmIntentService" />
和
<service
android:name="packagename.MyGcmListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
并在
<uses-permission android:name="your.package.name.permission.C2D_MESSAGE" />
写下你的包名代替
"your.package.name"
请看这个
你的接收器声明有一些错误
<receiver
android:name="yourpackage.receiver.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="yourpackage" />
</intent-filter>
</receiver>
Android 有效的清单片段:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<permission
android:name="my.package.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="my.package.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="my.package" />
</intent-filter>
</receiver>
<service
android:name="my.package.GcmListener"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
</application>
我有一个老问题:我无法使用 android 应用程序接收 GCM 消息。根据服务器日志,它们已成功传送到 GCM 服务器并进一步发送,但我的客户端应用程序似乎没有收到它们。
这是我的清单中与 GCM 相关的片段:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<permission
android:name="my.package.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="my.package.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION" />
<category android:name="my.package" />
</intent-filter>
</receiver>
<service android:name=".GcmIntentService" />
这是我的服务-class GcmIntentService:
public class GcmIntentService extends GcmListenerService {
private String TAG = "myReceiver";
@Override
public void onMessageReceived(String from, Bundle data) {
Log.d(TAG, "message received");//this log is never shown
if (!data.isEmpty()) {
Log.d(TAG, "interesting message receiver");
}
}
}
这是我的项目build.gradle依赖:
classpath 'com.google.gms:google-services:1.3.0-beta1'
我想我忘了添加一些东西,这就是它根本不起作用的原因。我尝试使用 WLAN 和 SIM 卡上网。所以问题不在互联网防火墙中。 Sender API 和 GCM-token 似乎是正确的(它们是从开发者帐户的相应设置中复制和粘贴的)。
提前感谢您的帮助。
编辑:请参阅下面的答案
有些事情是错误的/可能是错误的。你需要主activity.And的gcm注册码中的发件人id你有3次C2D_MESSAGE
权限,这是第一次错误(put.your.package.name
)。第二次是生产阶段正确,但不能用于开发,第三次你有正确的开发权限。
你应该只拥有一次。
确实像@Android 印度建议更改清单中的服务声明。
在清单中进行以下更改
替换以下代码
<service android:name=".GcmIntentService" />
和
<service
android:name="packagename.MyGcmListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
并在
<uses-permission android:name="your.package.name.permission.C2D_MESSAGE" />
写下你的包名代替 "your.package.name"
请看这个
你的接收器声明有一些错误
<receiver
android:name="yourpackage.receiver.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="yourpackage" />
</intent-filter>
</receiver>
Android 有效的清单片段:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<permission
android:name="my.package.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="my.package.permission.C2D_MESSAGE" />
<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="my.package" />
</intent-filter>
</receiver>
<service
android:name="my.package.GcmListener"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
</application>