c2dm: как получить сообщение в устройстве?(используя PHP) - PullRequest
2 голосов
/ 01 июня 2011

У меня есть регистрационный идентификатор и токен авторизации для c2dm. И тогда я передаю сохранить эти значения в БД. и используя 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);

c2dmReceiver

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
}

скажите, пожалуйста, какую ошибку я совершил ...

UPDATE

Привет всем, тот же код беспокоит меня сегодня. Ошибка, которую я сделал, с кодом PHP. вместо передачи значений как POST, я отправил его как GET. Когда я изменил его на POST, появляется сообщение о тосте. но все же есть некоторые проблемы.

Здесь заголовок и значения сообщения равны нулю. мой 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.

Пожалуйста, помогите мне ... Спасибо ...

Ответы [ 3 ]

3 голосов
/ 02 июня 2011

Наконец-то я нашел способ предоставления collapse_key и данных. Collapse_key должен быть строкой, которая является именем группы сообщений или типом сообщений.Если мы отправим более одного сообщения с одним и тем же ключом collapse_, самое последнее сообщение будет отправлено на устройство с сервера c2dm.

Пример: $ collapse_key = "важный";

И данные.это важная вещь.Это будет содержать сообщение, которое мы хотим отправить.

Пример: если мы хотим отправить сообщение «Хорошего дня», то я должен дать ему имя ключа.data. = "Хорошего дня";здесь «желания» является ключом.И в приемнике я должен получить сообщение с тем же именем ключа.

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

Извините всех ..

2 голосов
/ 01 июня 2011

Это мой код, который я использую для получения формы уведомления на C2DM-сервере, он также показывает уведомление на панели уведомлений.Он работает, вы можете сравнить свой код с моим кодом и исправить ошибку, если таковая имеется.Я надеюсь, что это помощь.

/ ** * Базовый класс для получателя сообщений C2D.Включает константы для строк, используемых * в протоколе.* /

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());
        }
    }
}
1 голос
/ 01 декабря 2011

Мои сообщения прошли, только когда я начал использовать:

Bundle extras = intent.getExtras();

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

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