web-dev-qa-db-ja.com

GcmListenerService.onMessageReceived()は呼び出されません

現在、アプリへのGCM通知の実装に取り​​組んでいます。

私が抱えている問題は、私のGcmListenerService実装のonMessageReceived()メソッドが呼び出されないことです。通知が自動的に生成されるため(これをonMessageReceived()メソッドを使用して独自の通知に置き換えたい)、GCMサーバーからデータを正常に受信しますが、その後、ログ呼び出しはログに出力されません。 。

サーバーからGCMサーバーに送信されるJSON

{
    "notification" : {
        "title" : "Title",
        "text" : "Message",
        "icon" : "@drawable\/ic_notification",
        "click_action" : "OPEN_MAIN_ACTIVITY"
    },
    "registration_ids":[
        "xxxx", "xxxx", "xxxx", "etc"
    ]
}

AndroidManifest.xml(GCM部分のみ)

<!-- GCM START -->
    <receiver
        Android:name="com.google.Android.gms.gcm.GcmReceiver"
        Android:exported="true"
        Android:permission="com.google.Android.c2dm.permission.SEND" >
        <intent-filter>
            <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
            <category Android:name="com.my.package" />
        </intent-filter>
    </receiver>

    <service
        Android:name=".Services.ListenerService"
        Android:exported="false" >
        <intent-filter>
            <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

    <service
        Android:name=".Services.IDListenerService"
        Android:exported="false">
        <intent-filter>
            <action Android:name="com.google.Android.gms.iid.InstanceID"/>
        </intent-filter>
    </service>
    <!-- GCM END -->

GcmListenerService(呼び出されたかどうかを確認するための簡単な印刷)

public class ListenerService extends GcmListenerService {

    private static final String TAG = "MyGcmListenerService";

    @Override
    public void onMessageReceived(String from, Bundle data) {
        String message = data.getString("title");
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "Message: " + message);
    }
}

トークンをリクエストする方法が適切かどうかはわかりませんが、必要に応じて投稿できます。

質問の一部が不明確な場合は、私に知らせてください。私は説明するのが得意ではありません。

14
Dan

this Githubの問題で説明されているように、これはまさにあなたの問題です:

From https://developers.google.com/cloud-messaging/server#notifications_and_data_messages "GCMはクライアントアプリに代わって通知部分を表示します。オプションのデータが提供されている場合は、ユーザーが通知をクリックしてクライアントアプリを開くと、クライアントアプリに送信されます。[...] Androidでは、アクティビティの起動に使用されるインテントでデータペイロードを取得できます。 "

したがって、データはアクティビティの起動に使用されるインテントで渡されますユーザーが通知をタップした後。これは、次のことを行う必要があることを意味します。

  • サーバーから送信する通知キーにclick_actionを追加します。例:.

    send_queue.append({'to': REGISTRATION_ID,
                   'message_id': random_id(),
                   "notification" : {
                      "body" : "Hello from Server! What is going on? Seems to work!!!",
                      "title" : "Hello from Server!",
                      "icon" : "@drawable/ic_school_white_48dp",
                      "sound": "default",
                      "color": "#03A9F4",
                      "click_action": "OPEN_MAIN_ACTIVITY"
                    },
                   'data': { 'message': "Hello" }})
    

通知ペイロードのリファレンスを参照してください: https://developers.google.com/cloud-messaging/server-ref#notification-payload-support

  • AndroidManifest.xmlユーザーが通知をクリックしたときに開くアクティビティにインテントフィルターを追加します。サーバー側の「click_action」キーで使用したのと同じアクション名を使用します。例:

    <activity
        Android:name=".ui.MainActivity"
        Android:label="@string/title_activity_main" >
        <intent-filter>
            <action Android:name="OPEN_MAIN_ACTIVITY" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    
  • LaunchModeを設定している場合は、onCreate()メソッドまたはのインテントからデータを取得しますonNewIntent()通知がクリックされたときに起動するアクティビティのsingleTopに、例:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        Intent intent = getIntent();
    
        if (intent.hasExtra(Constants.KEY_MESSAGE_TXT)) {
            String message = intent.getStringExtra(Constants.KEY_MESSAGE_TXT);
            Log.d(TAG, message);
        } 
    }
    

私はこれをテストし、それが機能することを確認できます。 (XMPP接続を使用)

12
bitek

ダウンストリームメッセージ(json)に通知が含まれている場合、GcmListenerService.onMessageReceived()は呼び出されません。

4
Zephyr

OnMessageReceivedでメッセージを受信するには、メッセージオブジェクトの最上位の「データ」フィールドを定義する必要があります。通知フィールドは自動的に処理され、通知を生成します。onMessageReceivedは、通知フィールドのデータを渡しません。

メッセージオブジェクトを更新してデータフィールドを含め、onMessageReceivedを呼び出す必要があります。

 {
 "notification":{
 "title": "Title"、
 "text": "Message"、
 "icon" : "@ drawable \/ic_notification"、
 "click_action": "OPEN_MAIN_ACTIVITY" 
}、
 "data":{
 "some_key": "some_value" 
}、
 "registration_ids":
 "xxxx"、 "xxxx"、 "xxxx"、 "etc" 
 
} 
3
Arthur Thompson

onMessageReceivedは「データのみ」のプッシュマッサージに対してのみ呼び出されます。

0
Sujit Yadav