2013-11-01 4 views
6

Sto cercando di ottenere l'ID di registrazione di un dispositivo (test utilizzando l'emulatore) per configurare le notifiche push tramite GCM.Impossibile avviare il servizio Intent {act = com.google.android.c2dm.intent.REGISTRATION (ha extra)} U = 0: non trovato

Ho provato il seguente codice, che mi dà il seguente errore:

Unable to start service Intent { act=com.google.android.c2dm.intent.REGISTRATION (has extras) } U=0: not found 

file di manifesto

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.me.pushnotifications" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> 

    <permission android:name="com.me.pushnotifications.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
    <uses-permission android:name="com.me.pushnotifications.permission.C2D_MESSAGE" /> 


    <uses-sdk 
     android:minSdkVersion="10" 
     android:targetSdkVersion="18" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

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

     </receiver> 


     <activity 
      android:name="com.me.pushnotifications.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> 
    </application> 

</manifest> 

Sto usando un BroadcastReceiver per raggiungere lo scopo:

package com.me.pushnotifications; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class MyBroadcastReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     // TODO Auto-generated method stub 
     String action = intent.getAction(); 
     Log.i("action::",action); 
     try{ 
      if(action.equals("com.google.android.c2dm.intent.REGISTRATION")){ 
       String regId = intent.getStringExtra("registration_id"); 
       String error = intent.getStringExtra("error"); 
       String unregistered = intent.getStringExtra("unregistered"); 
       Log.i("regId::",regId); 
      } 
      else if(action.equals("com.google.android.c2dm.intent.RECEIVE")){ 
       String data = intent.getStringExtra("data"); 
       Log.i("data::",data); 
      } 
     } 
     finally{ 

     } 
    } 

} 

MainActivity

package com.me.pushnotifications; 

import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final Context context = getApplicationContext(); 

     final String appId = getResources().getString(R.string.appId) ; 
     Log.i("appName::",appId); 
     Button activateButton,deactivateButton; 
     activateButton = (Button)findViewById(R.id.activateButton); 
     deactivateButton = (Button)findViewById(R.id.deactivateButton); 

     activateButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Log.i("activate::","clicked"); 
       Intent regIntent = new Intent("com.google.android.c2dm.intent.REGISTRATION"); 
       Log.i("intent::","created"); 
       regIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, 
         new Intent(), 0)); 
regIntent.putExtra("sender", "registration_id"); 
       startService(regIntent); 
      } 
     }); 

     deactivateButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Log.i("deactivate::","clicked"); 
       Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); 
       Log.i("intent::","created"); 
       unregIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, 
         new Intent(), 0)); 
       startService(unregIntent); 
      } 
     }); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

Ho installato le API di Google per API Livello 18. Quale può essere il motivo del problema?

+0

Dove si è dichiarato in .GCMIntentService manifest file ?? –

+0

sto usando un BroadcastReceiver invece di GCMIntentService –

+0

Controlla questo: http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/ –

risposta

0

aggiungere questa riga nel tag intent-filtro nel manifest

<action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

Ti piace questa

<intent-filter> 

       <!-- Receives the actual messages. --> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <!-- Receives the registration id. --> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

       <category android:name="com.androidhive.pushnotifications" /> 
      </intent-filter> 
+0

quella riga è già presente nel file manifest –

+0

@ user2739737 hai importato gcm.jar dalla cartella ectras da adt.if no quindi prima vai ad installare google play service goto android SDk manager-> extra-> Google Play Services poi messo gcm.jar file nella cartella lib (/ Users/SS/Desktop/Android/adt-bundle-mac-x86_64-20130717/sdk/extras/google/gcm/gcm-client/dist) percorso gcm.jar pulisci il tuo progetto quindi esegui – morroko

+0

http://stackoverflow.com/questions/19678787/cant-import-import-com-google-android-gcm-gcmbaseintentservice/19678841#19678841 controlla anche questo – morroko

0

Usa come questo:

<receiver 
    android:name="com.example.gcmclient.GcmBroadcastReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" > 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     <!-- Receives the registration id. --> 
     <action android:name="com.google.android.c2dm.intent.REGISTER" /> 

     <category android:name="com.example.gcmclient" /> 
    </intent-filter> 
</receiver> 
<service android:name="com.example.gcmclient.GcmMessageHandler" /> 

<meta-data android:name="com.google.android.gms.version" 
    android:value="@integer/google_play_services_version" /> 

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