簡體   English   中英

c2dm:如何在設備中接收消息? (使用 PHP)

[英]c2dm : how to receive the message in the device? (using PHP)

我有 c2dm 的注冊 ID 和身份驗證令牌。 然后我通過將這些值存儲在 db 中。 並使用 php,我可以向 c2dm 服務器發送一條消息。 但我的問題是我不知道如何在應用程序中接收消息。 我不確定我獲取消息的方式是否正確。 無論如何,我會在下面給出。

我有一項使用注冊意圖注冊到 c2dm 的活動。 和一個接收器來接收 reg_id 和通知消息。 它正在注冊 c2dm 並且不接收消息。

顯現

    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION"></action>
        <category android:name="my.android.c2dm"></category> 
    </intent-filter>
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"></action>
        <category android:name="my.android.c2dm"></category>
    </intent-filter>
    </receiver>

</application>

C2dmRegistration.class(活動)

    Intent objRegIntnet=new Intent("com.google.android.c2dm.intent.REGISTER");
    objRegIntnet.putExtra("app",PendingIntent.getBroadcast(this,0,new Intent(),0));
    objRegIntnet.putExtra("sender","mymail@gmail.com");
    startService(objRegIntnet);

c2dm接收器

public class c2dmReceiver extends BroadcastReceiver 
{
    private static String KEY = "c2dmPref";
    private static String REGISTRATION_KEY = "registrationKey";


    private Context context;



    @Override
    public void onReceive(Context context, Intent intent)
    {
        this.context = context;
        if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) 
        {
                  handleRegistration(context, intent);
             } 
        else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
        {
            handleMessage(context, intent);
             }              
    }

     private void handleRegistration(Context context, Intent intent) 
{
       //handles registeration
     }
     private void handleMessage(Context context, Intent intent)
{

    String title= intent.getStringExtra("title");
    String message= intent.getStringExtra("msg");
    Toast.makeText(context,"title : "+title+"\n message : "+message,1).show();
    //Do whatever you want with the message
}

請告訴我犯了什么錯誤...

更新

大家好,今天我正在使用相同的代碼。 我犯的錯誤是使用 php 代碼。 我沒有將值作為 POST 傳遞,而是以 GET 形式發送。 當我將其更改為 POST 時,將顯示 toast 消息。 但仍然存在一些問題。

標題和 msg 值在此處為 null。 我的 php 代碼是:

function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText)
 {
       //$messageText="have a nice day";
       //$msgtype="important";
       $headers = array('Authorization: GoogleLogin auth=' . $authCode);
       $data = array(
        'registration_id' => $deviceRegistrationId,
        'collapse_key' => $msgType,
        'data.message' => $messageText
                        );
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
      if ($headers)
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      $response = curl_exec($ch);
      curl_close($ch);
      return $response;
    }

實際上我不確定collapse_key和data.message變量應該使用什么類型的值。

請幫助我...謝謝...

最后我找到了給出collapse_key和數據的方法。collapse_key應該是一個字符串,它是一組消息或特定類型消息的名稱。 如果我們發送多個具有相同 collapse_key 的消息,最新的消息將從 c2dm 服務器發送到設備。

示例:$collapse_key = "重要";

還有數據。 是重要的事情。 這將包含我們要發送的消息。

例如:如果我們想發送一條消息“祝你有美好的一天”,那么我應該給它一個鍵名。 data.="祝你有美好的一天"; 這里的“願望”是關鍵。 在接收器中,我應該用相同的鍵名檢索消息。

private void handleMessage(Context context, Intent intent) 
{  
      String mywish= intent.getStringExtra("wishes");    
      Toast.makeText(context,"my wishes : "+mywish,1).show(); 
} 

對不起大家。。

這是我的代碼,我用它來接收通知表單 C2DM 服務器,它還在通知欄上顯示通知。 它正在運行,發現您可以將您的代碼與我的代碼進行比較並更正錯誤(如果有)。 我希望這是有幫助的。

/** * C2D 消息接收器的基礎 class。 包括協議中使用的字符串的常量 *。 */

public abstract class C2DMBaseReceiver extends IntentService {
private static final String C2DM_RETRY = "com.google.android.c2dm.intent.RETRY";

public static final String REGISTRATION_CALLBACK_INTENT = "com.google.android.c2dm.intent.REGISTRATION";
private static final String C2DM_INTENT = "com.google.android.c2dm.intent.RECEIVE";

// Logging tag
private static final String TAG = "C2DM";

// Extras in the registration callback intents.
public static final String EXTRA_UNREGISTERED = "unregistered";

public static final String EXTRA_ERROR = "error";

public static final String EXTRA_REGISTRATION_ID = "registration_id";

public static final String ERR_SERVICE_NOT_AVAILABLE = "SERVICE_NOT_AVAILABLE";
public static final String ERR_ACCOUNT_MISSING = "ACCOUNT_MISSING";
public static final String ERR_AUTHENTICATION_FAILED = "AUTHENTICATION_FAILED";
public static final String ERR_TOO_MANY_REGISTRATIONS = "TOO_MANY_REGISTRATIONS";
public static final String ERR_INVALID_PARAMETERS = "INVALID_PARAMETERS";
public static final String ERR_INVALID_SENDER = "INVALID_SENDER";
public static final String ERR_PHONE_REGISTRATION_ERROR = "PHONE_REGISTRATION_ERROR";

// wakelock
private static final String WAKELOCK_KEY = "C2DM_LIB";

private static PowerManager.WakeLock mWakeLock;
private final String senderId;

/**
 * The C2DMReceiver class must create a no-arg constructor and pass the
 * sender id to be used for registration.
 */
public C2DMBaseReceiver(String senderId) {
    // senderId is used as base name for threads, etc.
    super(senderId);
    this.senderId = senderId;
}

/**
 * Called when a cloud message has been received.
 */
protected abstract void onMessage(Context context, Intent intent);

/**
 * Called on registration error. Override to provide better error messages.
 * 
 * This is called in the context of a Service - no dialog or UI.
 */
public abstract void onError(Context context, String errorId);

/**
 * Called when a registration token has been received.
 */
public void onRegistrered(Context context, String registrationId)
        throws IOException {

}

/**
 * Called when the device has been unregistered.
 */
public void onUnregistered(Context context) {
}

@Override
public final void onHandleIntent(Intent intent) {
    try {
        Context context = getApplicationContext();
        if (intent.getAction().equals(REGISTRATION_CALLBACK_INTENT)) {
            handleRegistration(context, intent);
        } else if (intent.getAction().equals(C2DM_INTENT)) {
            //**C2DM Start

               Bundle extras = intent.getExtras();


                String pushNo =extras != null ? extras.getString("pushNo"):"";
                String scoreId =extras != null ? extras.getString("scoreId"):"";
                String notfId =extras != null ? extras.getString("notfId"):"";
                String fromId =extras != null ? extras.getString("fromId"):"";
                String toId =extras != null ? extras.getString("toId"):"";
                String matchId =extras != null ? extras.getString("matchId"):"";
                String msg =extras != null ? extras.getString("msg"):"";


                String ns = Context.NOTIFICATION_SERVICE;
                NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
                int icon = R.drawable.icon;    
                CharSequence tickerText = "Notification Receive";
                long when = System.currentTimeMillis();

                Notification notification = new Notification(icon, tickerText, when);

                Context context1 = context;
                //*****************
                final int CUSTOM_VIEW_ID = 1;
                RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);
                contentView.setImageViewResource(R.id.image, R.drawable.icon);
                contentView.setTextViewText(R.id.text, "Racquetime \n"+msg);

                notification.contentView = contentView;


              notification.defaults=Notification.FLAG_ONLY_ALERT_ONCE+Notification.FLAG_AUTO_CANCEL;
              Intent notificationIntent;
              if(GUIStatics.boolLoginStatus)
              {
                  notificationIntent = new Intent(this,ShowAllNotificationActiviry.class);
              }
              else{
                   notificationIntent = new Intent(this, HomeActivity.class);
              }
              notification.flags |= Notification.FLAG_AUTO_CANCEL;
                notification.defaults |= Notification.DEFAULT_SOUND;
                notification.flags |= Notification.FLAG_SHOW_LIGHTS;

                notificationIntent.putExtra("Tag", "C2DMBaseReceiver");
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                notification.contentIntent = contentIntent;
                mNotificationManager.notify(CUSTOM_VIEW_ID, notification);

                //**C2DM End
        //  onMessage(context, intent);
        } else if (intent.getAction().equals(C2DM_RETRY)) {
            C2DMessaging.register(context, senderId);
        }
    } finally {
        // Release the power lock, so phone can get back to sleep.
        // The lock is reference counted by default, so multiple
        // messages are ok.

        // If the onMessage() needs to spawn a thread or do something else,
        // it should use it's own lock.
        mWakeLock.release();
    }
}

/**
 * Called from the broadcast receiver. Will process the received intent,
 * call handleMessage(), registered(), etc. in background threads, with a
 * wake lock, while keeping the service alive.
 */
static void runIntentInService(Context context, Intent intent) {
    if (mWakeLock == null) {
        // This is called from BroadcastReceiver, there is no init.
        PowerManager pm = (PowerManager) context
                .getSystemService(Context.POWER_SERVICE);
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                WAKELOCK_KEY);
    }
    mWakeLock.acquire();

    // Use a naming convention, similar with how permissions and intents are
    // used. Alternatives are introspection or an ugly use of statics.
    String receiver ="com.commonsware.android.c2dm.C2DMReceiver";
    intent.setClassName(context, receiver);

    context.startService(intent);

}

private void handleRegistration(final Context context, Intent intent) {
    final String registrationId = intent
            .getStringExtra(EXTRA_REGISTRATION_ID);
    String error = intent.getStringExtra(EXTRA_ERROR);
    String removed = intent.getStringExtra(EXTRA_UNREGISTERED);

    if (Log.isLoggable(TAG, Log.DEBUG)) {
        Log.d(TAG, "dmControl: registrationId = " + registrationId
                + ", error = " + error + ", removed = " + removed);
    }

    if (removed != null) {
        // Remember we are unregistered
        C2DMessaging.clearRegistrationId(context);
        onUnregistered(context);
        return;
    } else if (error != null) {
        // we are not registered, can try again
        C2DMessaging.clearRegistrationId(context);
        // Registration failed
        Log.e(TAG, "Registration error " + error);
        onError(context, error);
        if ("SERVICE_NOT_AVAILABLE".equals(error)) {
            long backoffTimeMs = C2DMessaging.getBackoff(context);

            Log.d(TAG, "Scheduling registration retry, backoff = "
                    + backoffTimeMs);
            Intent retryIntent = new Intent(C2DM_RETRY);
            PendingIntent retryPIntent = PendingIntent
                    .getBroadcast(context, 0 /* requestCode */, retryIntent,
                            0 /* flags */);

            AlarmManager am = (AlarmManager) context
                    .getSystemService(Context.ALARM_SERVICE);
            am.set(AlarmManager.ELAPSED_REALTIME, backoffTimeMs,
                    retryPIntent);

            // Next retry should wait longer.
            backoffTimeMs *= 2;
            C2DMessaging.setBackoff(context, backoffTimeMs);
        }
    } else {
        try {
            onRegistrered(context, registrationId);
            C2DMessaging.setRegistrationId(context, registrationId);
            GUIStatics.registrationID=registrationId;
        } catch (IOException ex) {
            Log.e(TAG, "Registration error " + ex.getMessage());
        }
    }
}

我的消息只有在我開始使用時才通過:

Bundle extras = intent.getExtras();

String message = (String)extras.get("message");

Log.d("Tag", "msg:" + message);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM