2015-11-20 39 views
-1

我遵循developers.google.com的示例,并创建简单的服务以从GCM中检索令牌和消息。GCM Android 4.0.4无法获取消息

级令牌收到

public class RegistrationIntentService extends IntentService { 

    private static final String TAG = "RegIntentService"; 

    private static final String[] TOPICS = {"global"}; 

    private String projectNumber = "gcm-test-xxxxx"; 

    public RegistrationIntentService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 

     try { 

      InstanceID instanceID = InstanceID.getInstance(this); 
      String token = instanceID.getToken(projectNumber, 
        GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

      sendRegistrationToServer(token); 
      subscribeTopics(token); 
      sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply(); 


     } catch (IOException e) { 
      Log.d(TAG, "Failed to complete token refresh", e); 
      sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply(); 
     } 
     Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); 
    } 

    private void subscribeTopics(String token) { 

    } 

    private void sendRegistrationToServer(String token) throws IOException { 
     GcmPubSub pubSub = GcmPubSub.getInstance(this); 
     for (String topic : TOPICS) { 
      pubSub.subscribe(token, "/topics/" + topic, null); 
     } 
    } 

} 

这个类的工作很好,我可以检索令牌,做我想做的事情。 我从MainActivity

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     startService(new Intent(this, RegistrationIntentService.class)); 
    } 
} 

开始这个类的服务我也有类从GCM检索消息。这个班根本不工作。

public class MyGcmListenerService extends GcmListenerService { 
    String TAG = "MyGcmListenerService"; 

    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     String message = data.getString("message"); 
     Log.d(TAG, "From: " + from); 
     Log.d(TAG, "Message: " + message); 
     }  
} 

所有这些东西都在清单中注册。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="gcm_test.app"> 


    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 


    <application 
      android:allowBackup="true" 
      android:icon="@mipmap/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme"> 
     <activity 
       android:name=".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> 


     <receiver 
       android:name="com.google.android.gms.gcm.GcmReceiver" 
       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="gcm_test.app" /> 
      </intent-filter> 
     </receiver> 

     <service 
       android:name=".gcm.MyGcmListenerService" 
       android:exported="false"> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
      </intent-filter> 
     </service> 

     <service 
       android:name=".gcm.RegistrationIntentService" 
       android:exported="false"> 
     </service> 

    </application> 

</manifest> 

我发送消息与邮递员。

POST https://android.googleapis.com/gcm/send 
headers 
Content-Type:application/json 
Authorization:key= keyFromGoogleDevelopersConsole 
{ 
    "to" : "/topics/global", 
    "data":{ 
     "message": "Hello world!!!" 
    } 
} 

发送后我收到200 OK和消息ID,但手机没有收到任何消息。

我在做什么是错误的?如何收到我的消息?

我已将SenderID更改为Developers Console中的号码,但它没有帮助我。在调试控制台ASLO我注意到错误:

11-21 17:32:58.014 31813-31813/gcm_test.app E/dalvikvm﹕ Could not find class 'android.app.Notification$BigTextStyle', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zza 
11-21 17:32:58.024 31813-31813/gcm_test.app E/dalvikvm﹕ Could not find class 'android.os.UserManager', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zzap 
11-21 17:32:58.027 31813-31813/gcm_test.app E/dalvikvm﹕ Could not find class 'android.app.AppOpsManager', referenced from method com.google.android.gms.common.GooglePlayServicesUtil.zzb 

我认为这服务,retrives的消息需要以某种方式登记或启动。但是当我像简单的服务一样运行时,它崩溃了。

+0

如果您查看logc如果输出中没有过滤器,那么您希望收到消息时,您将看到如下所示的行:“I/GCM:GCM消息gcm_test.app 0:1448134660868753%04d3815af9fd7ecd”,如果消息是由您的设备接收的。如果你看到这个,但是你的GcmListenerService没有被调用,那么你知道你已经成功注册了GCM,但是这个消息没有通过你的服务。 –

回答

0

看起来您没有注册正确的发件人ID。 documentation解释了发件人ID是Google Developers Console中为您的应用项目列出的数字项目编号。您用于发件人ID的字符串gcm-test-xxxxx看起来像项目ID。

在在开发者控制台仪表盘页面,您的项目数据将包括这样一行:

ID: jade-segment-123 (#123123123123) 

在这个例子中,发件人ID为123123123123.

更新: 注此外您还没有使用以下网址中显示的网址:documentation

https://gcm-http.googleapis.com/gcm/send 
+0

你好,你从一开始就是对的。我设置了错误的发件人ID。但是当我改变它时,我没有看到这些消息,因为我将过滤器应用于具有信息级别的消息的IDEA控制台。所以愚蠢的错误=( 我没有测试这个网址https://gcm-http.googleapis.com/gcm/send,与https://android.googleapis.com/gcm/send正常工作。 非常感谢您的帮助。 –