C2DM java第三部分app的例子

时间:2012-02-03 12:47:07

标签: java android android-c2dm

我正在尝试做示例形式:http://www.vogella.de/articles/AndroidCloudToDeviceMessaging/article.html

我已经把所有东西都安装到了Android应用程序(我认为),但要模拟 服务器我一直有错误403。

代码与示例相同:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;


public class AuthenticationUtil 
{
    private AuthenticationUtil()
    {

    }

public static String getToken(String email, String password)
        throws IOException {
    // 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=CloudTut");
    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;
}   
}

并且错误回复:

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://www.google.com/accounts/ClientLogin
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
at AuthenticationUtil.getToken(AuthenticationUtil.java:48)
at GetAuthenticationToken.main(GetAuthenticationToken.java:8)

1 个答案:

答案 0 :(得分:0)

此代码来自功能正常的应用程序,对我来说效果很好。它使用C2DM帐户登录详细信息来请求身份验证令牌,然后可以使用该令牌向客户端设备发送C2DM消息。请注意,此代码来自Android应用,但通常会在服务器上执行。

public static String getClientLoginAuthToken() {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://www.google.com/accounts/ClientLogin");
    try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
        nameValuePairs.add(new BasicNameValuePair("Email", "C2DMEMAILADDRESS));
        nameValuePairs.add(new BasicNameValuePair("Passwd", "C2DMPASSWORD));
        nameValuePairs.add(new BasicNameValuePair("accountType", "GOOGLE"));
        nameValuePairs.add(new BasicNameValuePair("source", "Google-cURL-Example"));
        nameValuePairs.add(new BasicNameValuePair("service", "ac2dm"));
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);
        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line = "";
        while ((line = rd.readLine()) != null) {
            Trace.e("HttpResponse", line);
            if (line.startsWith("Auth=")) {
                return line.substring(5);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    Trace.e(TAG, "Failed to get C2DM auth code");
    return "";
}

如果您仍然遇到问题,那么最好假设C2DM帐户设置不正确,并创建另一个帐户。