android - GCM 在 android 2.3.6 中不接收消息但在 android 4.1.2 中工作

标签 android google-cloud-messaging android-2.3-gingerbread

我不知道我的 list 哪里有问题,只有android 2.3.6有问题。在我的 android 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>

更新

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。该设备在 android 2.3.x 中正确注册,但它没有收到消息,我在 onMessage 上的消息日志从未被调用,而在 android 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){

}

最佳答案

请尝试以下解决方法,不要使用(据我所知)任何已弃用的类。将操作 "com.google.android.c2dm.intent.REGISTRATION" 添加到 manifest 中的 GCMBroadcastReceiver。这将使您能够在 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 - GCM 在 android 2.3.6 中不接收消息但在 android 4.1.2 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18975540/

相关文章:

java - 在没有 Internet 连接时加载本地 JsonData

android - 在哪里将 google-services.json 文件放入 eclipse 项目?

error-handling - 'InvalidTokenVersion' 错误的 GCM 文档在哪里?

java - Android:在 ActionBarSherlock 项目中的 Android 2.3 上,按钮的 findViewById 返回 null

android - 在 android 中更新数据库版本时清除 Sqlite 数据库数据中的问题

android - 第 2 部分 由 UI 启动的持久性前台 android 服务,也可以在 sleep 模式下工作,也可以在手机重启时启动

java - 使用 RxJava 中的可观察线程对数据 "read only"执行某些操作

java - 如何将 android 客户端注册 token 发送到 FCM 服务器?

android - 选项卡的自定义 Holo 主题

android - 如何删除选项卡小部件之间的空格?