1

私はGCM自分のアプリケーションに実装しています。私はdeveloper.android.comからのGCMチュートリアルで与えられたすべてのステップに従いました

私のアプリケーションのビルドターゲットはを指していGoolge API 8 (Android 2.2 version)ます。

GCMからレジスタIDを正常に取得でき、このIDをアプリケーションサーバーに渡します。したがって、登録ステップは正常に実行されます。

これで、アプリケーションサーバーがPUSHメッセージをデバイスに送信すると、サーバーは次のようにメッセージを取得しますSUCCESS=1 FAILURE=0, etc.。つまり、サーバーはメッセージを正常に送信していますが、デバイスはメッセージを受信しません。

これについてたくさん調べた後、GCMがポート番号5228、5229、または5230にメッセージをプッシュすることがわかりました。

当初、私のデバイスとラップトップは一部のWebサイトで制限されていましたが、その後、すべてのWebサイトにアクセスするためのすべてのアクセス許可が付与されたため、これらのポート番号はデバイスで開いていると思います。

ですから、私の質問は次のとおりです。GCMからPUSHメッセージを受信することはほとんどありません。なぜGoogleはメッセージの配信にそれほど不確実なのですか?理由は何でしょうか?

私の次のコードを見て、それに応じて私を導いてください:

私はマニフェストで次のことを宣言しました:

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

    <permission
        android:name="package.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <!-- App receives GCM messages. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <!-- GCM connects to Google Services. -->
    <uses-permission android:name="android.permission.INTERNET" />

    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="package.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <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="packageName" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".ReceiveBroadcast"
            android:exported="false" >
            <intent-filter>
                <action android:name="GCM_RECEIVED_ACTION" />
            </intent-filter>
        </receiver>

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


/**
 * @author Shrikant.
 * 
 */
public class GCMIntentService extends GCMBaseIntentService {

    /**
     * The Sender ID used for GCM.
     */
    public static final String SENDER_ID = "myProjectID";

    /**
     * This field is used to call Web-Service for GCM.
     */
    SendUserCredentialsGCM sendUserCredentialsGCM = null;

    public GCMIntentService() {
        super(SENDER_ID);
        sendUserCredentialsGCM = new SendUserCredentialsGCM();
    }

    @Override
    protected void onRegistered(Context arg0, String registrationId) {
        Log.i(TAG, "Device registered: regId = " + registrationId);
        sendUserCredentialsGCM.sendRegistrationID(registrationId);
    }

    @Override
    protected void onUnregistered(Context context, String arg1) {
        Log.i(TAG, "unregistered = " + arg1);
        sendUserCredentialsGCM
                .unregisterFromGCM(LoginActivity.API_OR_BROWSER_KEY);
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.e("GCM MESSAGE", "Message Recieved!!!");
        String message = intent.getStringExtra("message");
        if (message == null) {
            Log.e("NULL MESSAGE", "Message Not Recieved!!!");
        } else {
            Log.i(TAG, "new message= " + message);
            sendGCMIntent(context, message);
        }
    }

    private void sendGCMIntent(Context context, String message) {
        Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("GCM_RECEIVED_ACTION");
        broadcastIntent.putExtra("gcm", message);
        context.sendBroadcast(broadcastIntent);
    }

    @Override
    protected void onError(Context context, String errorId) {
        Log.e(TAG, "Received error: " + errorId);
        Toast.makeText(context, "PUSH Notification failed.", Toast.LENGTH_LONG)
                .show();
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        return super.onRecoverableError(context, errorId);
    }
}

ありがとう。

4

3 に答える 3

2

デバッグ証明書の有効期限が切れているかどうかを確認します。有効期限が切れている場合は、新しい証明書を作成して新しいキーを生成します。

于 2013-03-19T10:21:54.630 に答える
0

クラス名をパッケージ名付きのフルネームに変更してみてください。好き:

<service android:name="com.xx.xx.xx" />

そして、ここにパッケージ名を入力することを忘れないでください:

<category android:name="packageName" />
于 2012-10-27T10:18:02.073 に答える
0

アプリ名と、APIキーを取得するためにGoogleコンソールに登録した名前が同じ名前であることを確認してください。まったく同じという意味で同じ名前

于 2012-12-05T05:05:48.553 に答える