我在商店里有一个Android应用程序,它使用GCM推送通知。问题是通知只能到达我发送给它的一些设备。特别是我注意到他们到了平板电脑而不是电话,但我只试过两个平板电脑和两个电话,所以这可能有意义也可能没有意义。这两款平板电脑都配备了Android 5.0或5.1,以及其中一款手机。另一部手机有4.4。
设备成功注册到通知并将其ID发送到我的服务器。从服务器发送通知时我没有收到任何错误,但它们从未到达。我试过wifi和3G连接,都没有运气。
我发现代码在网络的某个地方执行此操作,但无法真正记住在哪里。问题是我不完全理解它是如何工作的,但当时它似乎已经足够好了,因为我在其中一个接收通知的设备上进行了测试。我会发布所有相关代码,也许有人可以告诉我是否有问题。
这是我的清单(删除不相关的部分)
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<permission
android:name="edu.galileo.estudiantes.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="edu.galileo.estudiantes.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:icon="@drawable/appicon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
...
<receiver
android:name=".util.EstudiantesGcmReceiver"
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.name.gcm" /> <!-- I do have my actual package name here-->
</intent-filter>
</receiver>
<service android:name=".util.EstudiantesGcmListenerService" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
...
</application>
</manifest>
这是接收器
public class EstudiantesGcmReceiver extends WakefulBroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// Explicitly specify that GcmMessageHandler will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(),
EstudiantesGcmListenerService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
这是IntentService
public class EstudiantesGcmListenerService extends IntentService
{
public EstudiantesGcmListenerService() {
super("EstudiantesGcmListenerService");
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null && extras.containsKey("msg"))
{
String message = extras.getString("msg");
new Handler().post(() -> showNotification("Bla bla", message));
}
EstudiantesGcmReceiver.completeWakefulIntent(intent);
}
void showNotification(String title, String desc)
{
NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
long id = getLastNotificationId(this) + 1;
NotificationCompat.Builder b = new NotificationCompat.Builder(this)
.setContentTitle(title)
.setContentText(desc)
.setSmallIcon(R.drawable.small_icon)
.setTicker(desc)
.setAutoCancel(true).setVibrate(new long[]{300, 300, 300, 300});
Intent i = new Intent(this, LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(this, 0, i, 0);
b.setContentIntent(intent);
manager.notify((int) id, b.build());
storeLastNotificationId(id, this);
}
}
答案 0 :(得分:0)
1.Google建议使用 GCMReceiver 而不是 WakefulBroadcastReceiver
2.您必须使用 GcmListenerService
扩展您的服务3.此外,我们必须使用 InstanceId ,因为不推荐使用gcm.register()。(它仍会生成gcm密钥)。
https://developers.google.com/cloud-messaging/android/client
他们的使用示例代码“https://github.com/google/gcm”
一周前我遇到了类似问题,尤其是Micromax和Infocus手机。现在,通知工作正常。
答案 1 :(得分:0)
如问题中所述,GCM适用于安装了Android 5.0+的设备,而不适用于4.4.x版本。
除了@ m0rpheus5建议的更改外,请检查您是否在4.4.x版本的设备上安装了最新版本的Google Play服务。大多数时候将它更新到最新版本的工作!!
希望有所帮助!
答案 2 :(得分:0)
我已根据Google提供的新示例开始使用 GcmListenerService ,然后我开始面临奇怪的问题。
我可以在少数设备上接收GCM,但我无法在QMobile上接收GCM,这是一个使用Android 4.4.2的本地品牌,但我的旧应用程序 WakefulBroadcastReceiver 实现在同一台设备上正常运行
有什么建议吗?