Java gcm注册服务未注册

Java gcm注册服务未注册,java,android,google-cloud-messaging,message,Java,Android,Google Cloud Messaging,Message,因此,我正在使用gcm,当我尝试注册时,我成功地将令牌发送到我的后端,它将令牌发送到gcm,并回复200。唯一的问题是它的回复是200,但总是说未注册,并创建一个on失败。我想知道它的前端或后端问题是否会有很大帮助,谢谢。这是我的注册服务 package com.example.caesar.gcm; import android.app.IntentService; import android.content.Context; import android.content.Intent;

因此,我正在使用gcm,当我尝试注册时,我成功地将令牌发送到我的后端,它将令牌发送到gcm,并回复200。唯一的问题是它的回复是200,但总是说未注册,并创建一个on失败。我想知道它的前端或后端问题是否会有很大帮助,谢谢。这是我的注册服务

package com.example.caesar.gcm;

import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

import com.google.android.gms.gcm.GcmPubSub;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.google.android.gms.iid.InstanceID;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import org.json.JSONObject;

import java.io.IOException;

public class RegistrationIntentService extends IntentService {

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

    Context mContext = this;

    public String myData="";
    public String streamTitle = "",path="";

    public void onCreate() {
        super.onCreate();
        Log.d("Server", ">>>onCreate()");
    }

    public RegistrationIntentService() {
        super(TAG);
        Log.i(TAG, "ygfuyvjunvvgu");
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, startId, startId);
        Log.i("LocalService", "Received start id " + startId + ": " + intent);
        return START_STICKY;
    }

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

        try {

            Log.d(TAG,"HERERERERERER");
            SharedPreferences appPrefs = mContext.getSharedPreferences("com.example.gcmclient_preferences", Context.MODE_PRIVATE);
            String token = appPrefs.getString("token", "");
            assert token != null;
            if (token.isEmpty()) {
                try {
                    getGCMToken("10426431"); // Project ID: xxxx Project Number: 0123456789 at https://console.developers.google.com/project/...
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            Log.i(TAG, "GCM Registration Token: " + token);
            sendRegistrationToServer(token);
            subscribeTopics(token);
            sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply();
        } catch (Exception 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 getGCMToken(final String senderId) throws Exception {
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                String token = "";
                try {
                    InstanceID instanceID = InstanceID.getInstance(mContext);
                    token = instanceID.getToken(senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
                    if (token != null && !token.isEmpty()) {
                        SharedPreferences appPrefs = mContext.getSharedPreferences("com.example.gcmclient_preferences", Context.MODE_PRIVATE);
                        SharedPreferences.Editor prefsEditor = appPrefs.edit();
                        prefsEditor.putString("token", token);
                        prefsEditor.commit();
                    }
                    Log.i("GCM_Token", token);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute();
    }

    private void sendRegistrationToServer(String token) {

        AsyncHttpClient client = new AsyncHttpClient();

        final RequestParams params = new RequestParams();
        params.put("id", token);

        client.post("", params, new JsonHttpResponseHandler() {

            @Override
            public void onStart() {
                // called before request is started
            }

            public void onSuccess(int statusCode, PreferenceActivity.Header[] headers, JSONObject response) {

            }

            public void onFailure(int statusCode, PreferenceActivity.Header[] headers, JSONObject errorResponse, Throwable e) {
                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
            }

            @Override
            public void onRetry(int retryNo) {
                // called when request is retried
            }
        });
    }

    /**
     * Subscribe to any GCM topics of interest, as defined by the TOPICS constant.
     *
     * @param token GCM token
     * @throws IOException if unable to reach the GCM PubSub service
     */
    // [START subscribe_topics]
    private void subscribeTopics(String token) throws IOException {
        for (String topic : TOPICS) {
            GcmPubSub pubSub = GcmPubSub.getInstance(this);
            pubSub.subscribe(token, "/topics/" + topic, null);
        }
   }

你应该发布你的服务器端(后端)应用程序的代码。我确实粘贴了一些奇怪的东西,你是说gcmId是服务器从客户端应用程序收到的令牌?您是否尝试从已安装的客户端应用清除数据,然后重新运行该应用以获取新令牌,然后将此新令牌发送到服务器?是的,gcmId是我发送到服务器的令牌,是的,每次我要重新测试时我都这样做。我建议您将
sendRegistrationToServer(令牌);认购人(代币)进入
doInBackground()
内部
getGCMToken
。我从未在服务中使用过上述代码,因此我无法确定令牌是否会自动更改,并且您的客户端应用程序不会在更改时在服务器应用程序上更新令牌。
var options = 
    { 
        method: 'POST',
        uri: 'https://android.googleapis.com/gcm/send',
        headers: {
            'Content-Type': 'application/json',
            'Authorization':'key=VALUE'
        },
        body: JSON.stringify({
        "to" : gcmId,
        "data" : {
            message: message
        },
        })
    }
    request(options, function (error, response, body) {
        if(error) console.log(error);
        console.log("RESPONSE STATUS: " + response.statusCode)
        console.log("BODY: " + body);
        res.json({response: response.statusCode}); 
        });