GCM在Android 2.3.6中无法接收消息,但在Android 4.1.2中可以正常工作。

3

我不知道我的清单文件出了什么问题,问题只在android 2.3.6上。在我的安卓4.1.2平板电脑上,它可以接收到消息。我已经使用2.3.6收到了注册ID,但是从未收到过信息。请问有人能帮我吗?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ciqtech.quicky.mobile.passenger"
    android:versionCode="1"
    android:versionName="1.0"
    android:installLocation="preferExternal">

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

<permission
    android:name="com.ciqtech.quicky.mobile.passenger.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="com.ciqtech.quicky.mobile.passenger.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

 <!-- 
    GCM CONFIGURATION
 -->


<permission android:name="com.ciqtech.quicky.mobile.passenger.permission.C2D_MESSAGE" 
    android:protectionLevel="signature"/>

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.ciqtech.quicky.mobile.passenger.permission.C2D_MESSAGE" />    

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />


<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.Sherlock" >
    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="..." />
    <activity
        android:name="com.ciqtech.quicky.mobile.passenger.activities.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/app_id" />

    <activity android:name="com.facebook.LoginActivity" >
    </activity>

    <activity
        android:name="com.ciqtech.quicky.mobile.passenger.activities.PassengerActivity"
        android:label="@string/title_activity_passenger" >
    </activity>

    <activity
        android:name="com.ciqtech.quicky.mobile.passenger.activities.LoginActivity"
        android:label="@string/title_activity_login" >
    </activity>

   <!-- GCM
        RECEIVER
     -->
     <receiver
        android:name="com.ciqtech.quicky.mobile.passenger.broadcast_receivers.QuickyGCMBroadcastReceiver"
        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.ciqtech.quicky.mobile.passenger" />

        </intent-filter>
    </receiver>


    <service android:name=".services.GCMIntentService" android:enabled="true" />       

</application>

</manifest>

UPDATE

QuickyGCMBroadcastReceiver

 package com.ciqtech.quicky.mobile.passenger.broadcast_receivers;

import com.ciqtech.quicky.mobile.passenger.services.GCMIntentService;
import com.google.android.gcm.GCMBroadcastReceiver;
import android.content.Context;
import android.util.Log;

public class QuickyGCMBroadcastReceiver extends GCMBroadcastReceiver {

final String TAG = "QuickyGCMBroadcastReceiver";

@Override
protected String getGCMIntentServiceClassName(Context context) {
    Log.d(TAG, "GET GCM INTENT SERVICE CLASS NAME");
    return GCMIntentService.class.getName();
}

}

GCMIntentService. 在安卓 2.3.x 版本上设备注册成功,但无法接收到消息。我的 onMessage 消息日志从未被调用过,而在安卓 4.1.x 版本中它完美运行。感谢您的帮助。

package com.ciqtech.quicky.mobile.passenger.services;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Vibrator;
import android.provider.Settings.Secure;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import com.ciqtech.quicky.mobile.passenger.R;
import com.ciqtech.quicky.mobile.passenger.activities.LoginActivity;
import com.ciqtech.quicky.mobile.passenger.activities.PassengerActivity;
import com.ciqtech.quicky.mobile.passenger.broadcast_receivers.Device;
import com.ciqtech.quicky.mobile.passenger.configs.GCMSettings;
import com.ciqtech.quicky.mobile.passenger.dto.NotificationDTO;
import com.ciqtech.quicky.mobile.passenger.utils.SessionManager;
import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gms.gcm.GoogleCloudMessaging;


public class GCMIntentService extends GCMBaseIntentService {
Context ctx;
SharedPreferences prefs;

final String TAG = "GCMIntentService";
NotificationCompat.Builder builder;

public GCMIntentService() {
    super(GCMSettings.GCM_SENDER);
}

@Override
public void onError(Context context, String errorId) {
    Log.d(TAG + " - onError", "Messaging registration error: " + errorId);
}

@Override
protected boolean onRecoverableError(Context context, String errorId) {
    Log.d(TAG + "- onRecoverableError", "Received recoverable error: " + errorId);
    return super.onRecoverableError(context, errorId);
}

@Override
protected void onMessage(Context context, Intent intent) {
    String msg = intent.getExtras().getString( "msg" );

    Log.d(TAG, " - onMessage: " + msg);

    // [more code]
}

// Put the GCM message into a notification and post it.
private void sendNotification(String msg) {

}

@Override
public void onRegistered(Context context, String registrationId) {
    Log.d(TAG + " - onRegistered", "onRegistered()");
    prefs = context.getSharedPreferences("Quickytaxi-Notifications",0);
    String deviceID = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
    SessionManager session = new SessionManager(context);
    String uid = session.getUserDetails().get("id");
    Log.d(TAG, deviceID + " " + registrationId + " " + uid);
    Device.register(deviceID, registrationId, uid);
}

@Override
protected void onUnregistered(Context context, String s) {
    Log.d(TAG + "- onUnregistered", "onUnregistered()");
    String deviceID = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
    Device.unregister(deviceID);
}

public void notify(NotificationDTO notificationDTO, Intent intent){

}

}


请发布 QuickyGCMBroadcastReceiverGCMIntentService 的代码。 - Eran
谢谢你的帮助。我刚刚更新了我的帖子。请记住,这只发生在Android 2.3.x上,而在Android 4.1.x上它完美地工作。 - Daniel Flores
可能你的情况不同,但当他遇到类似问题时,我们发现设备关联的 Google 帐号未登录。我们添加了第二个帐号,但也没有解决问题。最后我们使用主帐号登录成功解决了问题。 - Syed Ali
3个回答

3
尝试使用以下解决方法,不使用任何已弃用的类(据我所知)。在您的manifest中的GCMBroadcastReceiver中添加操作"com.google.android.c2dm.intent.REGISTRATION"。这将使您的GCMBroadcastReceiver能够接收registration_id
<receiver
   android:name="YOUR_PACKAGE_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="YOUR_PACKAGE_NAME" />
      </intent-filter>
</receiver>

之后,您的 GCMBroadcastReceiver 就能够接收到 registration_id 了:
public void onReceive(Context context, Intent intent) 
{
   String regId = intent.getExtras().getString("registration_id");

   if(regId != null && !regId.equals("")) 
   {
       /* Do what ever you want with the regId eg. send it to your server */
   }
}

尽管我仍然遇到“SERVICE_NOT_AVAILABLE”错误,但我能够在我的“GCMBroadcastReceiver”中处理“registration_id”,并且我能够向我的智能手机发送消息。非常奇怪,但对我来说可以工作。

谢谢您的回复。我已经做了这个,但是在 Android 2.3.x 中问题仍然存在。 - Daniel Flores
没错。对于API 10,GCM必须按照旧的方式完成,就像上面所述(我的意思是接收器必须在应用程序内定义,而不是外部Google接收器)。 - Yar

3

我最近一周一直遇到同样的问题,但是简单的解决方法是修改Android.Manifest文件。你只添加了两个C2D_MESSAGE权限,但实际上需要三个。

<permission android:name="com.ciqtech.quicky.mobile.passenger.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.ciqtech.quicky.mobile.passenger.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.C2D_MESSAGE" />

这将适用于所有 Android 版本。


1

请确保在清单文件中指定的包名与 GCM 接收器配置中指定的类别名相匹配。根据提供的清单文件,您的包名应如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.ciqtech.quicky.mobile.passenger"
 android:versionCode="1"
 android:versionName="1.0" >

类似的问题可以在这里找到 GCM Push RECEIVE category Name on Android OS < 4.1。希望能帮到你。


谢谢您的回复。我已经尝试过了,但在Android 2.3.x上问题仍然存在。 - Daniel Flores

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