2012-07-05 2 views
4

Я следовал http://developer.android.com/guide/google/gcm/gs.html#server-app реализовать GCM в моем приложенииAndroid GCM: GCMRegistrar дает пустой регистрационный номер

    GCMRegistrar.checkDevice(this); 
     GCMRegistrar.checkManifest(this); 
     if (GCMRegistrar.isRegistered(this)) { 
      Log.d(TAG, GCMRegistrar.getRegistrationId(this)); 
     } 
     final String regId = GCMRegistrar.getRegistrationId(this); 

     if (regId.equals("")) { 
      GCMRegistrar.register(this, sender_id); 
      Log.d(TAG, "Registration id : "+GCMRegistrar.getRegistrationId(this)); 
     } 
      else { 
      Log.d("info", "already registered as" + regId); 
     } 

, которая возвращает пустую строку регистрации ID что еще нужно, чтобы получить регистрационный номер ??

ответ

1

Создание нового проекта с использованием консоли Google с тем же именем, что и имя приложения в eclipse, помогло мне решить эту проблему.

1
GCMRegistrar.checkDevice(this); 
    GCMRegistrar.checkManifest(this); 
    final String regId = GCMRegistrar.getRegistrationId(this); 

    if (regId.equals("")) { 
     GCMRegistrar.register(this, "YOUR_ACCOUNT"); 
    } else { 
     app.prefs.edit().putString("prefs_googleid", regId).commit(); 
     GCMRegistrar.setRegisteredOnServer(this, true); 
     Log.v(TAG, "Already registered"); 
    } 

затем ждать вызова обратно в ресивере, которые проходят GCMBaseIntentService в onRegistered ovverride, там вы получите удостоверение регистрации.

Во всяком случае я полный создать приложение, которое использует GCM после этого поста: http://developer.android.com/guide/google/gcm/gs.html

+0

Спасибо Giuseppe, я использовал ту же ссылку Но мое приложение не попадает на метод onRegistered() – techieWings

+0

вы реализовали проект BrodcastReceiver? – Giuseppe

3

Я также получил пустой регистрационный номер и, наконец, исправить ее. Вот мои решения:

1) проверьте идентификатор проекта. Она должна быть 12 гольца долго показан в гиперссылке консоли Google API (а не идентификатор проекта вы им в резюме проекта)
2) попробуйте изменить окончательной Строки RegID к Строке RegID. Я не знаю, почему, но это работает для меня.

Надеюсь, это поможет.

+0

Спасибо, но это не проблема в моем случае. – techieWings

+0

Удаление «final» из переменной идентификатора регистрации разрешило проблему для меня. Благодаря! – srgtuszy

+1

Я неправильно использовал идентификатор проекта и ключ сервера. спасибо за первое решение. – Youngjae

0

Я также получил пустую строку в качестве регистрационного идентификатора и решить ее следующим образом:

  1. Проверьте SenderId является ли правильным или нет.
  2. Проверьте, есть ли активная учетная запись google, подписанная на вашем устройстве, или нет.
  3. Проверьте права доступа, которые правильно определены в файле манифеста или нет.
+0

thnks, но даже это было сделано правильно – techieWings

10

Пустая строка появляется, когда устройство не зарегистрировано успешно. Могут быть следующие причины: для него -

  1. Положите GCM-код в пакет приложений. [Вы можете создать другой пакет с таким же именем пакета приложений]
  2. Положить все разрешения правильно.
+2

спасибо, но это было сделано правильно. – techieWings

+2

Я не знал, пока не найду, что код GCM должен быть в пакете приложений. – howettl

+4

Да Вы правы. Код GCM должен быть в основном пакете. Тогда только это работает. –

1

я получил тот же самый вопрос, решение было:

Вы должны реализовать GCMIntentService (простирающуюся от GCMBaseIntentService). И НЕ ДЕЛАЙТЕ !!! переименовать GCMIntentService что-то еще, это было причиной в моем случае.

+0

Я сделал это .. – techieWings

+0

-1 потому что 'GCMIntentService' - это просто имя по умолчанию (ожидается в основном пакете). Но вы можете использовать любой IntentService, если хотите, правильно, с' getGCMIntentServiceClassName() 'правильно переопределить –

0

Убедитесь, что вы определили службу в «app_package», как это намерение услуга будет называться по GCMBroadcastReceiver

Например

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

или

<service android:name="app_package.GCMIntentService" /> 

Сбой для определения правильно, не будет обратного вызова для onRegister, и ваш регистрационный идентификатор всегда пуст

0

У меня была такая же проблема с моим приложением. Первое, что было не так, было с моим GCMIntentService. Он должен быть в корне вашего пакета.

Я включу здесь короткий фрагмент моего GCMIntentService. Пожалуйста, имейте в виду, что вы получите RegistrationID по методу регистра GCMIntentService

public class GCMIntentService extends GCMBaseIntentService { 

private static final String TAG = "GCMIntentService"; 

public GCMIntentService() { 
    super(CloudMessagingUtility.SENDER_ID); 
} 

/** 
* Method called on device registered 
**/ 
@Override 
protected void onRegistered(Context context, String registrationId) { 
    Log.i(TAG, "Device registered: regId = " + registrationId); 

// здесь называют свои методы, чтобы отправить RegistrationID на свой веб-сервер CloudMessagingUtility.register (контекст, RegistrationID); }

/** 
* Method called on device un registred 
* */ 
@Override 
protected void onUnregistered(Context context, String registrationId) { 
    Log.i(TAG, "Device will unregister from Google Cloud Messaging"); 
    //unregister the device from your own webserver too 
    CloudMessagingUtility.unregister(context, registrationId); 
} 

/** 
* Method called on Receiving a new message 
* */ 
@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.i(TAG, "Received message from GCM:"); 
    String message = "";//TODO handle here the messages! 

} 

/** 
* Method called on receiving a deleted message 
* */ 
@Override 
protected void onDeletedMessages(Context context, int total) { 
    Log.i(TAG, "Received deleted messages notification"); 
    String message = getString(R.string.gcm_deleted, total); 
    displayMessage(context, message); 

} 

/** 
* Method called on Error 
* */ 
@Override 
public void onError(Context context, String errorId) { 
    Log.e(TAG, "Received error: " + errorId); 
} 

}

вы должны сделать правильные конфигурации в Android

e <service android:name=".GCMIntentService" /><receiver android:name="com.google.android.gcm.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 here" /> 
     </intent-filter> 
    </receiver> 
0

GCMRegistrar.register (это, sender_id); Log.d (TAG, «Идентификатор регистрации: » + GCMRegistrar.getRegistrationId (this));

Вызов getRegistrationId() прямо после регистрации() является рискованным, потому что регистр может не возвращать идентификатор сразу.

Для моего случая я сделал чек позже в моем сценарии (при нажатии кнопки) с помощью:

булевых зарегистрировано = GCMRegistrar.isRegistered (это);

если зарегистрировано, то позвоните в GCMRegistrar.getRegistrationId (this)); для получения удостоверения личности.

0

Я попробовал второе решение Ник Вонг и я изменил => public static final String PROPERTY_REG_ID = "registration_id"; к => public static String PROPERTY_REG_ID = "registration_id";

и просто работал.

+0

Замечательно! Для меня я реализовал все другие вещи, включая это правильно, но у моего имени пакета была опечатка. – techieWings

0

Поскольку GCMRegistrar.getRegistrationId является асинхронным, я добавил счетчик, чтобы проверить, действительно ли regId пуст или нет. Если пусто, счетчик просто увеличится и попытается снова получить идентификатор регистрации. Достаточно большого количества, такого как 100.

int counter = 0; 
       while (true) { 
        regID = GCMRegistrar.getRegistrationId(this); 
        counter++; 
        if (counter == 100 || regID != null || !regID.equals("")) { 
         break; 
        } 
       } 
0

Я решил изменить проект, используемый для регистрации в GCMRegistrar.зарегистрируйтесь от имени проекта до номера проекта google

Смежные вопросы