Ошибка Android GCM. Возврат сервера Не зарегистрирован при регистрации клиента
Я следил за демонстрацией, приведенной в http://developer.android.com/google/gcm/gs.html, и получил пробное приложение GCMTrial для правильной работы.
Но я попытался выполнить те же шаги в существующем приложении, но это не сработало. Поэтому я сделал совершенно новый проект. Но даже тогда, следуя тем же самым темным шагам, я не смог получить GCM, чтобы отправить сообщение успешно. Поэтому я попытался переименовать GCMTrial в требуемое имя, а не то, что тоже не работает.
Я регистрируюсь для GCM через основное действие и получаю следующий журнал:
12-19 21:30:13.102: V/GCMRegistrar(15889): Registering receiver
12-19 21:30:13.112: D/GCMBaseIntentService(15889): handleRegistration: registrationId = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, error = null, unregistered = null
12-19 21:30:13.112: D/GCMRegistrar(15889): resetting backoff for com.XXX.XXX
12-19 21:30:13.117: V/GCMRegistrar(15889): Saving regId on app version 1
Но когда я пытаюсь отправить сообщение GCM, он возвращает следующую ошибку
[ errorCode=NotRegistered ]
Код клиента:
public class MainActivity extends Activity {
TextView tve;
String TAG = "GCMTrial";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, "XXXXXX");
Log.v(TAG, "Reg");
} else {
Log.v(TAG, "Already registered");
}
}
GCMIntentService :
public class GCMIntentService extends GCMBaseIntentService {
@Override
protected void onError(Context arg0, String arg1) {
// TODO Auto-generated method stub
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
Log.d("GCM", "RECIEVED A MESSAGE");
// Get the data from intent and send to notificaion bar
}
@Override
protected void onRegistered(Context arg0, String arg1) {
// TODO Auto-generated method stub
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
// TODO Auto-generated method stub
}
}
Манифест:
Код сервера:
System.out.println("Sending GCM");
String key = "XXX"; //Server API key taken from the site
clientID = "XXXXXXXXX"; // copied from the logs
Sender sender = new Sender(key);
Message message = new Message.Builder().build();
Result result = sender.send(message, clientID, 1);
System.out.println(result.toString());
Это сводит меня с ума.. Он показывает, что зарегистрирован в телефоне Android, даже вызывает метод onRegistered класса GCMIntentService.. но когда я пытаюсь отправить сообщение, он помещает "NotRegistered Error"...
Я не знаю, что я делаю неправильно. Пожалуйста, помогите мне парням....
Ответы
Ответ 1
Ну, знайте, что это ошибка при установке с помощью adb.
GCMRegistrar не знает, что устройство не зарегистрировано на сервере GCM и не регистрируется.
Что вы можете сделать, так это зарегистрироваться:
if (regId.equals("")) {
GCMRegistrar.register(this, "XXXXXX");
Log.v(TAG, "Reg");
} else {
//I SAY BULLSHIT !
GCMRegistrar.register(this, "XXXXXX");
Log.v(TAG, "Reg");
}
Или uninstal приложение на клиенте, а затем запустите новую установку из Adb.
Имейте в виду, что в производстве мало шансов.
Ответ 2
вы забыли добавить конструктор в свой GCMIntentService
добавьте следующее к вашему GCMIntentService
public GCMIntentService(){
super(SENDER_ID);
}
SENDER_ID - это XXXXXXX, который использовался для регистрации вашего приложения.
Ответ 3
Вы можете попробовать заменить контекст "this" на "getApplicationContext()", чтобы использовать контекст приложения. Вот мой пример кода:
private void registerGCM() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
//prevent crash caused by no google account or not support for gcm
try {
GCMRegistrar.checkDevice(this);
} catch (Exception e) {
Log.i("test", "!!!cgm " + e.toString());
return;
}
}
final String regId = GCMRegistrar.getRegistrationId(this);
if (TextUtils.isEmpty(regId)) {
String gcmSenderId = PreferencesUtil.getStringPreference(PreferencesUtil.SETTING_GCM_SENDER_ID,
"", getApplicationContext());
GCMRegistrar.register(getApplicationContext(), gcmSenderId);
}
mGCMRegisted = true;
}