0

初めての Android アプリを開発しています。徹底的に検索しましたが、まだ解決策にたどり着けず、フィニッシュ ラインまであまり時間がありません。

私のアプリは GCM サーバーに登録できます。私のサーバーはまだ準備ができていませんが、メッセージの送信 (サーバー -> デバイス) をテストして、オンライン サービスを介して送信します (これらの送信で GCM が成功を返すことに注意してください)。問題は、GooglePlay サービスから受信機にメッセージが届かないように見えることです。

Android デベロッパー ガイドから始めて、これらのコードをセットアップします。

AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="it.uniroma1.informatica.didapp.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="it.uniroma1.informatica.didapp.permission.C2D_MESSAGE" />

    <receiver
        android:name="it.uniroma1.informatica.didapp.remote.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="it.uniroma1.informatica.didapp" />
        </intent-filter>
    </receiver>
    <service android:name="it.uniroma1.informatica.didapp.remote.GCMIntentService" />

GCMBroadcastReceiver.java

public class GCMBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);
}

}

最後に、GCMIntentService.java

public class GCMIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;

public GCMIntentService() {
    super("GCMIntentService");
}

@Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
    String messageType = gcm.getMessageType(intent);

    if (!extras.isEmpty()) {
               if(GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
            sendNotification("Send error: " + extras.toString());
        } else if(GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
            sendNotification("Deleted messages on server: " + extras.toString());
        } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
            sendNotification("Message: " + extras.toString());
        }
    }
    GCMBroadcastReceiver.completeWakefulIntent(intent);
}

private void sendNotification(String msg) {
    mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Start.class), 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
        .setContentTitle("GCM Notification")
        .setStyle(new NotificationCompat.BigTextStyle()
        .bigText(msg))
        .setContentText(msg);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}
}

私が必要とするのは非常に簡単です:

  1. サーバーが GCM に通知を送信 (ペイロードなし)
  2. GCM はそれをデバイスに転送します
  3. デバイスはシステム バーに通知を表示し、最終的にアクティビティを開始します
4

1 に答える 1

0

これが問題かもしれないと思います:

ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());

context.getPackageName()を返しますit.uniroma1.informatica.didappが、インテント サービスは にありit.uniroma1.informatica.didapp.remoteます。アプリのメイン パッケージに移動してみてください。

public ComponentName (文字列 pkg、文字列 cls)

API レベル 1 で追加

新しいコンポーネント識別子を作成します。

パラメーター

pkg コンポーネントが存在するパッケージの名前。null にすることはできません。

cls コンポーネントを実装する pkg 内のクラスの名前。null にすることはできません。

于 2013-10-02T15:56:05.997 に答える