0

Android Dev Site のチュートリアルに従いましたが (新しい GCM API を使用しています)、GCM セットアップに関してすべてが正しく行われていることを確認したいので、次のように分割します。セクション:

マニフェスト ファイル:

1) 私のアプリケーションのパッケージ名は次のとおりです: package="com.abc.xyz.demo"

<permission android:name="com.abc.xyz.demo.permission.C2D_MESSAGE"   android:protectionLevel="signature" />

<uses-permission android:name="com.abc.xyz.demo.permission.C2D_MESSAGE" />

私のブロードキャスト レシーバーとインテント サービスは、次のようにマニフェストにあります。

 <receiver
            android:name="com.abc.xyz.demo.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">

            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.abc.xyz.demo" />
            </intent-filter>
        </receiver>

        <service android:name="com.abc.xyz.demo.gcm.GCMIntentService" />

com.abc.xyz.demo.gcm パッケージには、GCMBroadcastReceiver と GCMIntentService が含まれています。次のように、今のところブロードキャスト レシーバーのみを使用しています (チュートリアルで IntentService はオプションであると述べられているため)。

public class GCMBroadcastReceiver extends BroadcastReceiver 
{
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;
    Context ctx;

    public TWGCMBroadcastReceiver() 
    {
        Log.i("GCMAudit", "Receiver Instaniated!");
    }

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
        ctx = context;

        String messageType = gcm.getMessageType(intent);

        if (messageType != null && messageType.length() > 0)
        {
            if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) 
                sendNotification("Send error: " + intent.getExtras().toString());
            else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) 
                sendNotification("Deleted messages on server: " +intent.getExtras().toString());
            else 
                sendNotification("Received: " + intent.getExtras().toString());

            setResultCode(Activity.RESULT_OK);
        }
        else
        {
            setResultCode(Activity.RESULT_CANCELED);
        }
    }

        // Put the GCM message into a notification and post it.
private void sendNotification(String msg) 
{
    mNM = (NotificationManager)ctx.getSystemService(Context.NOTIFICATION_SERVICE);
    PendingIntent cI = PendingIntent.getActivity(ctx, 0, new Intent(ctx, Main.class), 0);
    ...
    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

正常に登録でき、regId をアプリケーション サーバーに送信できることに注意してください (現在、サーバーに直接アクセスすることはできません)。

ここにいくつかの一般的なクエリがあります:

1) Web アプリケーション サーバーまたは GCM は、パッケージ名を知る必要がありますか? その場合、明示的に送信する必要がありますか? 現在、Google プロジェクトから送信者 ID のみを送信しています。

2) パッケージ名が問題の場合、Android アプリケーションのパッケージ名をサーバーのパッケージ名 (存在する場合) と一致させるにはどうすればよいですか?

3) 上記の放送受信機の実装はテスト目的に十分ですか? または、サービスも書き出さない限り、メッセージは表示されませんか? (そうは思わない)

4) ブロードキャスト レシーバーの単体テストを行うにはどうすればよいですか? 現時点ではサーバーを操作できないため (メッセージを送信するための Web UI しかありません)

4

2 に答える 2

0

とてもシンプルです。

アプリは と通信しGCM server、 を取得しregistration IDます。register メソッドには、パッケージ名を内部的に取得するためのコンテキストが必要です。明示的に送信する必要はありません。

登録 ID を取得したら、それをアプリ サーバーに送信します。

次に、アプリサーバーは同じものを使用してRegIdプッシュメッセージを送信します。ただし、アプリ サーバーはモバイルと直接通信しません。登録 ID とAPI_KEY.

GCM サーバーは、固有の reg ID を介して既に電話を認識しています。そのため、GCM サーバーはプッシュ メッセージをさらにモバイルに送信します。プロセス全体で、 GCM SERVER だけがあなたとあなたのデバイスを認識しており、他の誰も認識していません。したがって、プロセス全体は GCM サーバーを介してのみ実行できます。

また、理解しておくべき重要な点の 1 つは、登録 ID の取得中に使用されたパッケージ名が、プッシュ メッセージごとに返されることです。ブロードキャスト レシーバーでは、パッケージ名は次の方法で取得できます。

 String category = intent.getPackage();

お役に立てれば。

于 2014-07-02T04:07:47.170 に答える
0

GCM は、登録時に暗黙的にパッケージ名を取得します。サーバーがパッケージ名を取得することに関しては、サーバーが GCM メッセージを複数のアプリに送信する場合に必要になります。その場合、登録 ID をサーバーに送信するときに、この登録 ID が属するアプリを指定する追加データを送信する必要があります。

放送受信機で十分です。インテント サービスは必要ありません。

最後の質問で何を言っているのかわかりません。アプリにメッセージを送信する方法はありますか? ブロードキャスト レシーバをテストするには、メッセージを送信する必要があります。

于 2013-08-12T09:06:51.517 に答える