2

デバイスIDを取得してデータベースに保存できます。何かが発生したときに、プッシュ通知を送信しようとしましたが、電話に配信されません。これが私のPHPで行うことです:

$url = 'https://android.googleapis.com/gcm/send';

$device_ids = array( $device_id );

$headers = array('Authorization: key=' . 'my_api_key',
'Content-Type: application/json');

$t_data = array();
$t_data['message'] = 'Someone commented on your business.';

$t_json = array( 'registration_ids' => $device_ids , 'data' => $t_data );

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: key=my_id', 'Content-Type: application/json' ) );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $t_json ) );

curl_setopt($ch, CURLOPT_URL, $url);

$result = curl_exec($ch);
if ($result === FALSE)
{
     die('Curl failed: ' . curl_error($ch));
}

curl_close($ch);

そして、これが私がcurl_exec呼び出しから得た結果です:

{"multicast_id":8714083978034301091,"success":1,"failure":0,"canonical_ids":0,"r‌​esults":[{"message_id":"0:1350807053347963%9aab4bd8f9fd7ecd"}]} 

私が疑問に思っていることの1つは、独自のRecieverクラスを作成するなど、アプリで何か特別なことをする必要があるかどうかです。ありがとう!

編集:

これが私のGCMIntentServiceクラスです。

package com.problemio;

import static com.google.android.gcm.GCMConstants.ERROR_SERVICE_NOT_AVAILABLE;
import static com.google.android.gcm.GCMConstants.EXTRA_ERROR;
import static com.google.android.gcm.GCMConstants.EXTRA_REGISTRATION_ID;
import static com.google.android.gcm.GCMConstants.EXTRA_SPECIAL_MESSAGE;
import static com.google.android.gcm.GCMConstants.EXTRA_TOTAL_DELETED;
import static com.google.android.gcm.GCMConstants.EXTRA_UNREGISTERED;
import static com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_LIBRARY_RETRY;
import static com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_MESSAGE;
import static com.google.android.gcm.GCMConstants.INTENT_FROM_GCM_REGISTRATION_CALLBACK;
import static com.google.android.gcm.GCMConstants.VALUE_DELETED_MESSAGES;

import java.util.Random;
import java.util.concurrent.TimeUnit;

import com.google.android.gcm.GCMBaseIntentService;

import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
import android.widget.Toast;

import utils.GCMConstants;

public class GCMIntentService extends GCMBaseIntentService 
{
    public GCMIntentService() 
    {
            super(ProblemioActivity.SENDER_ID);
    }

    @Override
      protected void onRegistered(Context ctxt, String regId) {
        Log.d(getClass().getSimpleName(), "onRegistered: " + regId);
        Toast.makeText(this, regId, Toast.LENGTH_LONG).show();
      }

      @Override
      protected void onUnregistered(Context ctxt, String regId) {
        Log.d(getClass().getSimpleName(), "onUnregistered: " + regId);
      }

      @Override
      protected void onMessage(Context ctxt, Intent message) {
        Bundle extras=message.getExtras();

        for (String key : extras.keySet()) {
          Log.d(getClass().getSimpleName(),
                String.format("onMessage: %s=%s", key,
                              extras.getString(key)));
        }
      }

      @Override
      protected void onError(Context ctxt, String errorMsg) {
        Log.d(getClass().getSimpleName(), "onError: " + errorMsg);
      }

      @Override
      protected boolean onRecoverableError(Context ctxt, String errorMsg) {
        Log.d(getClass().getSimpleName(), "onRecoverableError: " + errorMsg);

        return(true);
      } 
}

アップデート:

LogCatを見ると、メッセージがデバイスに届いていることがわかりました。しかし、デバイスは何らかの理由でプッシュ通知を表示していません。

4

3 に答える 3

3

応答から、メッセージが配信されているようです。Androidでは、デバイスでメッセージを受信するために、GCMBaseIntentServiceを拡張するGCMIntentServiceクラスが必要です。SDKサンプルに含まれているgcm-demo-clientをチェックして、これをアプリに実装するための適切なアプローチを確認する必要があります。サーバーからメッセージを受信するには、CommonUtilitiesクラスでSENDER_ID(Googleプロジェクト番号)を設定するだけで済みます。

詳細はこちら

GCMIntentServiceで通知を生成するには、次を使用できます。

 //Issues a notification to inform the user that server has sent a message.

private static void generateNotification(Context context, String message, String title,) {

        int icon = R.drawable.logo;

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        Intent notificationIntent = new Intent(context, AnActivity.class);

        // set intent so it does not start a new activity
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);        
        Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);            

         Notification notification = new NotificationCompat.Builder(context)
         .setContentTitle(title)
         .setContentText(message)
         .setContentIntent(intent)
         .setSmallIcon(icon)
         .setLights(Color.YELLOW, 1, 2)
         .setAutoCancel(true)
         .setSound(defaultSound)
         .build();

        notificationManager.notify(0, notification);
}

マニフェストに受信者も登録しましたか?アプリケーションタグの下?

    <!--
      BroadcastReceiver that will receive intents from GCM
      services and handle them to the custom IntentService.

      The com.google.android.c2dm.permission.SEND permission is necessary
      so only GCM services can send data messages for the app.
    -->
    <receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!-- Receives the registration id. -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.google.android.gcm.demo.app" />
        </intent-filter>
    </receiver>

    <!--
      Application-specific subclass of GCMBaseIntentService that will
      handle received messages.

      By default, it must be named .GCMIntentService, unless the
      application uses a custom BroadcastReceiver that redefines its name.
    -->
    <service android:name=".GCMIntentService" />
于 2012-10-22T18:37:27.610 に答える
1

メッセージにそのタイプの前のメッセージを上書きさせることを計画している場合にのみ、collapseKeyが必要です。したがって、アプリが同期する必要があるメッセージを送信する場合は、折りたたみキーを指定して、同期メッセージを1つだけ送信するようにすることができます。公式ドキュメントには、その使用方法が記載されています。

于 2012-10-20T18:14:22.767 に答える
0

GCMサーバーから通知を送信するときに、どのURLを使用しますか? https://android.googleapis.com/gcm/sendまたは https://gcm-http.googleapis.com/gcm/send

于 2015-08-12T05:43:17.657 に答える