1

重複の可能性:
Android アプリを C2DM に登録する

そのため、超クールなチャット アプリで C2DM を使用する方法を確認するために、手元にあるものすべてを調べて読んでいました。

サーバー担当者が処理しなければならないあらゆる種類のものがあることがわかりましたが、1 つのことを理解していませんでした。

登録プロセスには、senderId を含める必要があります。これは基本的に、アプリを使用しているアプリ (またはユーザー) として Google サーバーに転送される Google ID です。これにより、プッシュ クライアントとして識別されます。

私の質問は、ユーザーに登録ダイアログを表示する必要がありますか? アプリはすでに Facebook 接続を使用しており、それらのプロンプトが多すぎるとユーザーにとって敵対的であり、確実にアプリをアンインストールすることになるため、ユーザーにとっては恐ろしいことのように思えます。

C2DM に登録する 1 つのアプリのプロセスは何ですか? また、Google Play が使用する既存の認証トークンを使用するにはどうすればよいですか?


私は(3回目)C2DMの使用に関するVogellaのturoialを読みましたが、これが私の質問の基礎です:

public void register(View view) {
    Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER");
    intent.putExtra("app",PendingIntent.getBroadcast(this, 0, new Intent(), 0));
    intent.putExtra("sender", "youruser@gmail.com");  //WHICH EMAIL?
    startService(intent);
}

4 行目に使用されている電子メールは、デバイスの所有者の電子メールですか、それともサービスの電子メールですか?

ユーザーについて話している場合、別の認証ダイアログなしでこれを取得する方法はありますか? 私はすでに Facebook にログインしていますが、ユーザーに不快感を与えたくありません。

4

2 に答える 2

1

C2DM の非常に簡単な実装ガイドである vogella の記事を参照してください。

http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html

そこに言及されているすべてのものとコード、私は個人的にそのコードを実装しており、それは正常に機能しています。

于 2012-06-26T12:07:56.093 に答える
0

まず、Google の C2DMにサインアップする必要があります

次に、C2DM アプリケーションの認証トークンを取得します

function(){
        // Create the post data
        // Requires a field with the email and the password
        StringBuilder builder = new StringBuilder();
        builder.append("Email=").append(email);
        builder.append("&Passwd=").append(password);
        builder.append("&accountType=GOOGLE");
        builder.append("&source=MyLittleExample");
        builder.append("&service=ac2dm");

        // Setup the Http Post
        byte[] data = builder.toString().getBytes();
        URL url = new URL("https://www.google.com/accounts/ClientLogin");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setUseCaches(false);
        con.setDoOutput(true);
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded");
        con.setRequestProperty("Content-Length", Integer.toString(data.length));

        // Issue the HTTP POST request
        OutputStream output = con.getOutputStream();
        output.write(data);
        output.close();

        // Read the response
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String line = null;
        String auth_key = null;
        while ((line = reader.readLine()) != null) {
            if (line.startsWith("Auth=")) {
                auth_key = line.substring(5);
            }
        }

        // Finally get the authentication token
        // To something useful with it
        return auth_key;
}

アップデートを受信するには、クライアント モバイル デバイスを C2DM に登録する必要があります。

public void register(View view) {
    Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER");
    intent.putExtra("app",PendingIntent.getBroadcast(this, 0, new Intent(), 0));
    intent.putExtra("sender", "youruser@gmail.com");
    startService(intent);
}

サービスは非同期で Google に登録し、登録が成功すると「com.google.android.c2dm.intent.REGISTRATION」インテントを送信します。アプリケーションは、このインテントのためにブロードキャスト レシーバーを登録する必要があります。これには、Android システムがこれを内部的にチェックするため、パッケージに基づくパーミッションを使用する必要もあります。

<receiver android:name=".C2DMMessageReceiver"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"></action>
        <category android:name="de.vogella.android.c2dm.simpleclient" />
    </intent-filter>
</receiver>

///

public class C2DMRegistrationReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    Log.w("C2DM", "Registration Receiver called");
    if ("com.google.android.c2dm.intent.REGISTRATION".equals(action)) {
        Log.w("C2DM", "Received registration ID");
        final String registrationId = intent
                .getStringExtra("registration_id");
        String error = intent.getStringExtra("error");

        Log.d("C2DM", "dmControl: registrationId = " + registrationId
                + ", error = " + error);
        // Send and store this in your application server(unique for each device)
    }
}
}

これで、サーバー経由で C2DM メッセージの送信を開始できます

private final static String AUTH = "authentication";

    private static final String UPDATE_CLIENT_AUTH = "Update-Client-Auth";

    public static final String PARAM_REGISTRATION_ID = "registration_id";

    public static final String PARAM_DELAY_WHILE_IDLE = "delay_while_idle";

    public static final String PARAM_COLLAPSE_KEY = "collapse_key";

    private static final String UTF8 = "UTF-8";

    public static int sendMessage(String auth_token, String registrationId,
            String message) throws IOException {

        StringBuilder postDataBuilder = new StringBuilder();
        postDataBuilder.append(PARAM_REGISTRATION_ID).append("=")
                .append(registrationId);
        postDataBuilder.append("&").append(PARAM_COLLAPSE_KEY).append("=")
                .append("0");
        postDataBuilder.append("&").append("data.payload").append("=")
                .append(URLEncoder.encode(message, UTF8));

        byte[] postData = postDataBuilder.toString().getBytes(UTF8);

        // Hit the dm URL.

        URL url = new URL("https://android.clients.google.com/c2dm/send");
        HttpsURLConnection
                .setDefaultHostnameVerifier(new CustomizedHostnameVerifier());
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type",
                "application/x-www-form-urlencoded;charset=UTF-8");
        conn.setRequestProperty("Content-Length",
                Integer.toString(postData.length));
        conn.setRequestProperty("Authorization", "GoogleLogin auth="
                + auth_token);

        OutputStream out = conn.getOutputStream();
        out.write(postData);
        out.close();

        int responseCode = conn.getResponseCode();
        return responseCode;
    }

参照

于 2012-06-26T12:25:30.347 に答える