2012-05-01 10 views
0

を受けたことはありません。実際に私のサーバーからメッセージが届くこともありますが、文字通りデータの半分に過ぎません。 (私は4桁の数字を期待していして「○○..のみ最初の2桁を受けた)。 しかし最近、当社の放送受信機は、サイレント絶対残っていた。したがって、私は実験を開始し、どのように確認するために、Googleのサーバーに自分のC2DMメッセージをプッシュ事のあなたは、私が送信方法の例のクラスを見つけて、C2DMメッセージを受け取ることができますポストの下部に。C2DMのメッセージは、私がC2DM介してメッセージを受信苦労してる

を行っている。それはとてもあなたがC2dmStaticTest.autopilot(yourSenderId, "foo bar", yourServerSideAuthCode, this, this.getPackageName());

のいくつかの活動と撮影にプラグインすることができ、すべてのかなりの自立です

私は何が起こっているか概要を説明しましょう:

  • 静的変数を設定する放送受信機を登録し、それ以外androidManifest.xmlにされてしまうかのアクションとカテゴリを設定するBroadcastReceiver
  • で使用。
  • サーバーをC2DMへの登録の意図を送信します。

注意:ローカルのビルド済みのブロードキャスト受信者は、受信したすべてのインテントについてログメッセージを生成します。 クラス内でログメッセージが発行されるたびに、タグは「c2dmTest」になります。

registration_idでc2dmの回答を受け取ると、これもログに記録され、 になり、c2dmメッセージがプッシュされます。
私はここで私のサーバーをモデリングしています。 私はバックテストとして、実際のインテントと似ているfakeC2DMメッセージを発行し、RECEIVEアクションの機能についてブロードキャストレシーバをテストします。

私は私がサーバーにプッシュ任意のメッセージを受信して​​いないよC2DMサーバからの登録トークンを受け取ることができますが。序文で述べたように、Webサーバーがメッセージを送信しているときと同じ動作を観察します。

私は私の非常に最高のを試してみましたが、私はまた、メッセージがサーバーに正常に配信されると信じて、私はそれに応じて放送受信機を実装しましたし、メッセージ送信するためのサーバ応答コードは常にOK 200 /であるから確信しています。

しかし、結果は期待されたものではありませんが、私は他に何ができるか考えていません。 「メッセージの配信は保証されていません」のようなパッセージを見つけることは奨励していません。私は今、何もすべてで配信されていない意味:status code: 200はデータだけでセマンティックエラーがあったかもしれない通信が成功したことを示していないことを私は学んだ私たちのサーバーの人にこれを提示するC

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.util.Log; 

public class C2dmStaticTest { 


    private static String  RECEIVE   = "com.google.android.c2dm.intent.RECEIVE"; 
    private static String  REGISTER  = "com.google.android.c2dm.intent.REGISTER"; 
    private static String  REGISTRATION = "com.google.android.c2dm.intent.REGISTRATION"; 

    private static Context  ctx; 
    private static String  packageName; 
    private static String  message; 
    private static String  auth_code; 

    private static IntentFilter mIntFilt  = new IntentFilter(); 

    //@formatter:off 
    private static BroadcastReceiver mBroadRec = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      final String broadcastAction = intent.getAction(); 
      C2dmStaticTest.log("localReceiver onReceive for action: "+ broadcastAction); 

      if (C2dmStaticTest.REGISTRATION.equals(broadcastAction)) { 
       //execution continues here upon arrival of registration_id 
       String registration_id = intent.getStringExtra("registration_id"); 
       C2dmStaticTest.log("registered for c2dm.\n key is: "+registration_id); 


       C2dmStaticTest.log("==> start real self test"); 
       selfTestC2DM(registration_id, message, auth_code); 
       C2dmStaticTest.log("<== real self test done"); 


       C2dmStaticTest.log("==> start fake test"); 
       selfTestFake(); 
       C2dmStaticTest.log("<== fake test done"); 

       C2dmStaticTest.log("<~~ bye"); 

      } else if (C2dmStaticTest.RECEIVE.equals(broadcastAction)) { 
       C2dmStaticTest.log("Received message: " + intent.getStringExtra("message")); 
      } 
     } 
    }; 
    //@formatter:on 

    public static void autopilot(String sender_id, String message, String auth_code, Context ctx, String packageName) { 
     // setup static variables 
     C2dmStaticTest.ctx = ctx; 
     C2dmStaticTest.packageName = packageName; 
     C2dmStaticTest.message = message; 
     C2dmStaticTest.auth_code = auth_code; 

     C2dmStaticTest.log("==> register broadcastReceiver"); 
     mIntFilt.addAction("com.google.android.c2dm.intent.RECEIVE"); 
     mIntFilt.addAction("com.google.android.c2dm.intent.REGISTRATION"); 
     mIntFilt.addCategory(packageName); 
     ctx.registerReceiver(mBroadRec, mIntFilt); 

     C2dmStaticTest.log("==> register for c2dm"); 
     C2dmStaticTest.registerForC2dm(ctx, sender_id); 
     // will continue in localBroadCastReceiver on Receive for REGISTRATION 
    } 

    private static void registerForC2dm(Context ctx, String sender_id) { 
     Intent registrationIntent = new Intent(C2dmStaticTest.REGISTER); 
     registrationIntent.putExtra("app", PendingIntent.getBroadcast(ctx, 0, new Intent(), 0)); // boilerplate 
     registrationIntent.putExtra("sender", sender_id); 
     ctx.startService(registrationIntent); 
    } 

    private static void selfTestFake() { 
     Intent intent = new Intent(); 
     intent.setAction(C2dmStaticTest.RECEIVE); 
     intent.putExtra("message", "Bender: \"kiss my shiny metal ass!\""); 
     intent.addCategory(C2dmStaticTest.packageName); 
     C2dmStaticTest.ctx.sendBroadcast(intent); 
    } 

    public static void selfTestC2DM(String registration_id, String message, String auth_code) { 

     // create HttpClient 
     HttpClient mHttpClient = new DefaultHttpClient(); 

     // create HttpPost 
     final HttpPost post = new HttpPost("https://android.apis.google.com/c2dm/send"); 
     post.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
     post.addHeader("Authorization", "GoogleLogin auth=" + auth_code); 

     // set payload data ... 
     final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     nameValuePairs.add(new BasicNameValuePair("registration_id", registration_id)); 
     nameValuePairs.add(new BasicNameValuePair("collapse_key", "foo")); 
     nameValuePairs.add(new BasicNameValuePair("data.message", message)); 

     // ... and push it in the post 
     try { 
      post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     } catch (final Exception e) { 
      e.printStackTrace(); // never had a problem here 
     } 

     // start it! 
     try { 
      HttpResponse resp = mHttpClient.execute(post); 
      if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
       // now the message should be send, not? 
       C2dmStaticTest.log("Message send.\nServer response: " + resp.getStatusLine().getStatusCode()); 
      } else { 
       C2dmStaticTest.log("Unexpected Server response.\nServer response: " + resp.getStatusLine().getStatusCode()); 
      } 
     } catch (final Exception e) { 
      C2dmStaticTest.log("Unexpected Exception in execute()"); 
      e.printStackTrace(); 

     } 
    } 

    public static void log(String message) { 
     Log.d("c2dmTest", message); 
    } 
} 

答えて

0

OK、 。

このシナリオでは、私は実際にキーが一致しないというエラーを示すJSONObjectも受け取りました。
これは私があらゆるレベルでコミュニケーションの問題と呼んでいるものです...

関連する問題