启动服务时出现异常:com.google.android.c2dm.intent.REGISTER

An exception occurred when starting service: com.google.android.c2dm.intent.REGISTER

我正在使用 Urban Airship 来接收推送通知。该应用程序可以编译,但我没有收到推送通知,我在 Android Studio 日志中看到了这一点:

`D/Example - UALib: Starting GCM
V/Example - UALib: Version code changed to 10. GCM re-registration required.
D/Example - UALib: GCMRegistrar startService
E/Example - UALib: An exception occurred when starting service: com.google.android.c2dm.intent.REGISTER
                      java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.google.android.c2dm.intent.REGISTER (has extras) }
                          at android.app.ContextImpl.validateServiceIntent(ContextImpl.java:1813)
                          at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1842)
                          at android.app.ContextImpl.startService(ContextImpl.java:1826)
                          at android.content.ContextWrapper.startService(ContextWrapper.java:516)
                          at com.urbanairship.push.GCMRegistrar.startService(GCMRegistrar.java:401)
                          at com.urbanairship.push.GCMRegistrar.register(GCMRegistrar.java:126)
                          at com.urbanairship.push.PushService.startPushService(PushService.java:306)
                          at com.urbanairship.push.PushService.onHandleIntent(PushService.java:136)
                          at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
                          at android.os.Handler.dispatchMessage(Handler.java:102)
                          at android.os.Looper.loop(Looper.java:135)
                          at android.os.HandlerThread.run(HandlerThread.java:61)`

在我的 AndroidManifest.xml 文件中,我有这个:

`<receiver android:name="com.urbanairship.push.GCMPushReceiver" 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" />
        <!-- MODIFICATION REQUIRED - Use your package name as the category -->
        <category android:name="com.example" />
    </intent-filter>
    <!--  REQUIRED for detecting when the application is upgraded so it can request a new GCM ID -->
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <data android:scheme="com.example"/>
    </intent-filter>
</receiver>
<service android:name="com.urbanairship.push.PushService" android:label="Push Notification Service"/>`

在我的 build.grandle 文件中,我将 "targetSdkVersion 23" 用于 API 级别 23,用于 Android 6.0; "minSdkVersion 16" API 16 级,Android 4。1.x 如果我没记错的话。

我的 Urban Airship 配置正确,经 Urban Airship 支持团队确认。此问题与我的应用程序向 GCM 注册推送服务有关。这不会通过 Urban Airship 发生,而是在应用程序和 GCM 本身之间发生。一旦我的应用程序从 GCM 收到有效的注册 ID,该 ID 就会传递给 Urban Airship。

我知道 GCM 已被弃用,在 https://developers.google.com/cloud-messaging/ 他们说:"Firebase Cloud Messaging (FCM) is the new version of GCM"。我的问题是,我仍然可以使用 API 级别 23 的 GCM,还是我必须从 GCM 升级到 FCM 才能使推送通知正常工作?我什至尝试过这个,但我无法在 GCM 中注册我的应用程序以获取推送服务:

`
Context context = getApplicationContext();
NotificationManager notificationManager = (NotificationManager) context
    .getSystemService(Context.NOTIFICATION_SERVICE);
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
try {
    gcm.register();
} catch (IOException e) {
    e.printStackTrace();
}`

崩溃是由于隐式意图启动服务,而该服务在与 GCM 的旧集成中是必需的。我相信 Google 停止允许 Android Lollipop 中服务的隐式意图,所以一旦你改变了目标 SDK 版本,它可能会开始崩溃,因为应用程序不再 运行 处于兼容模式。

我建议更新到最新版本的 Urban Airship。自 3.x 以来发生了很多变化,因此这可能是一次相当大的迁移。第一步是删除清单条目和jar,然后按照Android Platform guide集成最新版本。