应用程序通过 Android 上的 Google Cloud Messaging 保持强制关闭

Posted

技术标签:

【中文标题】应用程序通过 Android 上的 Google Cloud Messaging 保持强制关闭【英文标题】:App Keeps Force Closing with Google Cloud Messaging on Android 【发布时间】:2014-04-20 20:27:17 【问题描述】:

我正在制作自己的 android 应用程序,并在此过程中发现了 GCM(Google Cloud Messaging)。我完全按照以下教程进行操作:http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/

好消息是几乎一切正常,除了每次我发送推送通知时,App force 在设备上关闭。我认为 Eclipse 项目没有任何问题,我在我的设备上运行 Android 4.2.2。没有编译错误。我不知道为什么应用程序一直强制关闭,这让我抓狂。

代码与上面链接中列出的代码完全相同。作为参考,这是我的 logcat:

E/AndroidRuntime( 7261): FATAL EXCEPTION: main
E/AndroidRuntime( 7261): java.lang.RuntimeException: Unable to instantiate receiver com.javapapers.android.GcmBroadcastReceiver: java.lang.ClassNotFoundException: Didn't find class "com.javapapers.android.GcmBroadcastReceiver" on path: /data/app/com.javapapers.android-1.apk
E/AndroidRuntime( 7261):        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2428)
E/AndroidRuntime( 7261):        at android.app.ActivityThread.access$1600(ActivityThread.java:151)
E/AndroidRuntime( 7261):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1358)
E/AndroidRuntime( 7261):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 7261):        at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 7261):        at android.app.ActivityThread.main(ActivityThread.java:5285)
E/AndroidRuntime( 7261):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 7261):        at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 7261):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
E/AndroidRuntime( 7261):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
E/AndroidRuntime( 7261):        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
E/AndroidRuntime( 7261):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 7261): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.javapapers.android.GcmBroadcastReceiver" on path: /data/app/com.javapapers.android-1.apk
E/AndroidRuntime( 7261):        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
E/AndroidRuntime( 7261):        at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
E/AndroidRuntime( 7261):        at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
E/AndroidRuntime( 7261):        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2423)
E/AndroidRuntime( 7261):        ... 11 more
W/GTalkService( 1430): [DataMsgMgr] broadcast intent callback: result=CANCELLED forIntent  act=com.google.android.c2dm.intent.RECEIVE pkg=com.javapapers.android (has extras) 

我的清单如下所示:

    <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.javapapers.android.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.javapapers.android.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="16" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <activity
        android:name=".RegisterActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name="com.javapapers.android.MainActivity"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/app_name" >
    </activity>

    <receiver
        android:name=".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="com.javapapers.android" />
        </intent-filter>
    </receiver>

    <service android:name=".GCMNotificationIntentService" />

我正在竭尽全力试图找出问题所在,因此感谢您提供任何和所有帮助。

【问题讨论】:

供将来参考:不要在 pastebin 链接中发布近 7000 行 logcat。我已经将相关部分编辑到您的问题中。问题很可能是您没有在清单中声明 BroadcastReceiver 对不起,不完全确定什么是相关的(所以发布了所有内容),我会记住它以备将来使用。至于声明它,我用清单文件更新了 OP。它被声明为“.GcmBroadcastReceiver” 【参考方案1】:

您的GcmBroadcastReceiver 位于哪个包中?

当使用 . 前缀时,就像您在声明 .GcmBroadcastReceiver 时所做的那样,. 会转换为您的包名称。因此,除非GcmBroadcastReceiver 位于com.javapapers.android 中,否则它将不起作用。

【讨论】:

为了确定,我回到项目中确定。 “GcmBroadcastReceiver”位于 com.javapapers.android 包中,所以一切都应该没问题。我继续将清单中的“.GcmBroadcastReceiver”更改为“com.javapapers.android.GcmBroadcastReceiver”,但是在运行应用程序时并没有什么不同。仍然强制关闭。 我刚刚意识到一件事。我在使用 Android 4.2.2 设备时引用了 Google API [Android 4.3]。我应该尝试改变它吗?问题是,在我遵循的教程中没有人提到类似的问题(OP 中的链接)。我担心如果我更改 Google API 参考,事情可能会变得更加混乱。 编辑:好的,尝试将 Google API 的版本更改为 4.2.2。应用仍然强制关闭。【参考方案2】:

即使我也面临同样的担忧。右键单击项目转到 -> 构建路径 -> 配置构建路径 -> 订购和导出 -> 选中 Android 依赖项(google paly services.jar)移至顶部。现在清理并构建并运行您的应用程序。

【讨论】:

以上是关于应用程序通过 Android 上的 Google Cloud Messaging 保持强制关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上的 Google 地图上的标记旁边显示标签?

Android 上的 Google 实时多人游戏

为啥我在 Google 地图上的当前位置在 Android 应用中不正确? [复制]

Android 模拟器上的 Google Play 服务和 Google Play 游戏应用

Google Cloud Messaging 上的特殊消息(推送到 Android)

如何使用 Google FCM 和 Microsoft azure 作为托管服务器从 chrome for android 上的 PWA 发送推送通知