3

gcmサーバーとクライアントの開始に関するGoogleの指示に従いました。私の問題は、サーバーから成功したgcmを取得することです:

MulticastResult(multicast_id=8287827393174436535,total=1,success=1,failure=0,canonical_ids=0,results: [[ messageId=0:1366468335181772%8e1522ac00000031 ]]

クライアントでメッセージを受信する動きを確認できません - onMessage() は呼び出されません。私が知る限り、クライアントIDとサーバーIDは正しいです。

助けていただければ幸いです... :)

サーバー側のコード:

try {

Sender sender = new Sender(API_KEY);
Message message = new Message.Builder().collapseKey("1")
        .timeToLive(3)
        .delayWhileIdle(true)
        .addData("message",
                "this text will be seen in notification bar!!").build();

ArrayList<String> devices = new ArrayList<String>();

devices.add(DEVICE_ID1); 
//devices.add(DEVICE_ID2);

MulticastResult result = sender.send(message, devices, 2);
//Result result = sender.send(message, DEVICE_ID1, 2);
System.out.println(result.toString());
if (result.getResults() != null) {
    int canonicalRegId = result.getCanonicalIds();
    if (canonicalRegId != 0) {
    }
} else {
    int error = result.getFailure();
    System.out.println(error);
}
} catch (Exception e) {
    // TODO: handle exception
}

クライアントコード: 登録:

GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
          GCMRegistrar.register(this, SENDER_ID); // Note: get the sender id from configuration.
          String regIdString = GCMRegistrar.getRegistrationId(this);
          Log.v(TAG, "RegisterId, regId: " + regIdString);
        } else {

          Log.v(TAG, "Already registered, regId: " + regId);
        }

および gcmIntentServiceCreated (部分的に) :

public class GCMIntentService extends GCMBaseIntentService {
public GCMIntentService(){
        super(SENDER_ID);       
    }
@Override
    protected void onMessage(Context context, Intent intent) {
         Log.i("Registration", "Got a message!");
             Log.i("Registration", context.toString() + " " + intent.toString());
    }
...
}

クライアントのマニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <permission android:protectionLevel="signature" android:name="com.example.myapp.permission.C2D_MESSAGE"></permission>
    <uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE"/>
    <!-- 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" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.myapp.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <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="com.example.myapp" />
          </intent-filter>
        </receiver>
        <service android:name=".GCMIntentService" />
    </application>

</manifest>
4

3 に答える 3

2

メッセージを受信する可能性を最大限にするために、time_to_live をわずか 3 秒に設定することはしません。デフォルト値の 4 週間がかかるように、このパラメーターを完全に省略します。また、delay_while を false に設定して、アイドル状態でも電話がメッセージを受信できるようにします。

于 2013-04-20T15:24:56.320 に答える
0

onMessage メソッドで次のコードを変更します。

Log.i("Registration", "Got a message!");
             Log.i("Registration", context.toString() + " " + intent.toString());

これに:

String message=intent.getStringExtra("message"); 
Log.w("The message received is", message);

この助けを願っています

于 2013-04-20T16:06:11.790 に答える
0

gcm は成功ステータス 1 を送信するため、メッセージは確実にデバイスに送信されます。アプリの GCMReceiver コードを確認してください。

于 2013-04-20T14:47:42.857 に答える