Подтвердить что ты не робот

Ошибка 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"... Я не знаю, что я делаю неправильно. Пожалуйста, помогите мне парням....

4b9b3361

Ответ 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;
}