1

私はこれに到達しないことを望んでいましたが、私は過去2日間、かなり単純に見えるもので頭を悩ませてきました。googlevogellaのチュートリアルに従って、C2DMアプリケーションクライアント+サーバーをすでに実装しました。

私は私の問題を簡単に説明しようとします:

  1. クライアントアプリケーションがregistrationIdを正常に受信しました。
  2. サーバーが認証トークンを正常に受信しました。
  3. サーバーは、認証トークンとデバイスのregistrationIdを使用してメッセージを送信します。
  4. サーバーからクライアントにメッセージを送信すると、成功したメッセージ応答コードが表示されます(たとえば、id = 0:1335303367614556%fd55792500000030応答コード:200、C2DMに関するGoogleのドキュメントによると成功したメッセージである必要があります)。

したがって、おそらく私の問題はメッセージの受信者にあると思います。メッセージはサードパーティのサーバーからC2DMサーバーに送信されますが、そこからアプリケーションに到達できないためです。

StackOverflowの関連トピックで、デバイスのポートに問題がある可能性があることを読みましたが、現在、アプリケーションの登録とメッセージの受信の両方に同じレシーバーを使用しており、登録部分は毎回機能します。

これが私の受信機です:

public class C2DRegistrationReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if (action != null){
        if (action.equals("com.google.android.c2dm.intent.REGISTRATION")){
            // do something     
        }
        else if (action.equals("com.google.android.c2dm.intent.RECEIVE")){
            // do something else
        }
    }
}
}

私のマニフェストファイル:

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

<!-- SDK min version -->
<uses-sdk android:minSdkVersion="8" />


<!-- Only this application can receive the messages and registration result --> 
<permission android:name="ro.raullepsa.coder.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="ro.raullepsa.coder.permission.C2D_MESSAGE" />

<!-- This app has permission to register and receive messages from Google's c2dm -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<!-- Permission to use internet -->
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <!-- Activities -->
    <activity
        android:name="ro.raullepsa.coder.activity.MainActivity"
        android:label="@string/app_name" 
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name="ro.raullepsa.coder.activity.RegistrationResultActivity" />
    <activity android:name="ro.raullepsa.coder.activity.MessageReceivedActivity" />
    <receiver 
        android:name="ro.raullepsa.coder.util.c2d.C2DRegistrationReceiver" 
        android:permission="com.google.android.c2dm.permission.SEND">

        <!-- Receive messages -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="ro.raullepsa.coder" />
        </intent-filter>

        <!-- Receive the registration id -->
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="ro.raullepsa.coder" />
        </intent-filter>
    </receiver>
</application>
</manifest>

エラーは発生しません。アプリケーションの再インストール、再登録、2つの別々のレシーバーでの試行、C2DMから実行されているすべてのサービスを手動で強制停止して再インストールしましたが、それでも何も起こりません。

デバッグモードでレシーバーの最初の行を待機しようとしましたが、登録時にそこに到達しますが、サーバーからメッセージを送信した後は応答しません。

私はちょっと立ち往生しているので、助けていただければ幸いです。私のアプリケーションは基本的にLarsVogelのチュートリアルですが、必要に応じてさらに多くのコードを提供できます。私は何が欠けていますか?

4

2 に答える 2

1

さて、何か面白いことが起こりました。前夜からコードを変更していませんが、今朝起きてWifiをオンにするとメッセージが届きました。

これですべてが正常に機能します。メッセージを送信するとすぐに、自動的にデバイスにアクセスします。(はい、私のWifiも昨夜ありました)

Googleサーバーから肯定応答コードを受信して​​いましたが、デバイスには何も受信していなかったため、遅延の原因はわかりません。おそらく最初のメッセージを送信するのに少し時間がかかりましたか?私はわかりません。

私は他のWifiネットワークで試しましたが、それも機能します。もうこれにぶつからないことを願っています。それでも、私はその振る舞いがどういうわけか奇妙だと思います。

于 2012-04-25T11:18:59.913 に答える
1

バックグラウンドデータとしてデバイスに届くGCM通知。

にあるバックグラウンドデータを有効にします

[設定]>[アカウントと同期]>バックグラウンドデータ

于 2012-10-19T08:59:10.050 に答える