【问题标题】:Using Android to submit to a Google Spreadsheet Form使用 Android 提交到 Google 电子表格表单
【发布时间】:2011-05-30 10:12:31
【问题描述】:

第一次在这里提问。通常我不用问就能找到答案,但这次我被卡住了,无法弄清楚我错过了什么。

我只是想让我的 Android 应用在网站上填写表格并提交。我不需要应用程序对发回的任何数据做任何事情,只需填写表格并提交即可。基本上我正在尝试收集投票应用程序的结果。我认为表单提交会很简单,所以我创建了一个 Google 电子表格并用它制作了一个表单。我想我会将 Android 应用程序指向表单,然后我会将所有数据放在电子表格中以供以后查看。不过,我无法让 Android 应用程序实际填写表格。这是资源。

Form

Spreadsheet

private void submitVote(String outcome) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&ifq");

    List<BasicNameValuePair> results = new ArrayList<BasicNameValuePair>();
    results.add(new BasicNameValuePair("entry.0.single", cardOneURL));
    results.add(new BasicNameValuePair("entry.1.single", outcome));
    results.add(new BasicNameValuePair("entry.2.single", cardTwoURL));

    try {
        post.setEntity(new UrlEncodedFormEntity(results));
    } catch (UnsupportedEncodingException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
    try {
        client.execute(post);
    } catch (ClientProtocolException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    } catch (IOException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
}

我将表单和电子表格都公开了,所以请随意摆弄它,并尝试让它自己工作。

我的程序没有错误,没有编译错误,也没有 DDMS 错误。当我实际运行程序并单击执行此代码的按钮时,我可以看到延迟,因为现在这是在 UI 线程中,所以我知道它正在执行它。似乎一切正常,但我的电子表格根本没有更新。

有什么想法吗?我确信我错过了一些愚蠢的东西,但我们将不胜感激。

这是包含大量日志记录和调试内容的更新代码。

private void submitVote(String outcome) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&amp;formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&amp;ifq");

    List<BasicNameValuePair> results = new ArrayList<BasicNameValuePair>();
    results.add(new BasicNameValuePair("entry.0.single", cardOneURL));
    results.add(new BasicNameValuePair("entry.1.single", outcome));
    results.add(new BasicNameValuePair("entry.2.single", cardTwoURL));

    try {
        post.setEntity(new UrlEncodedFormEntity(results));
    } catch (UnsupportedEncodingException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
    try {
        HttpResponse httpResponse = client.execute(post);
        Log.e("RESPONSE", "info: " + httpResponse);

        BufferedReader rd = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
        String line;
        while ((line = rd.readLine()) != null) {
        Log.i("words", line);   
        }

        Intent intent = new Intent(this, ReadingView.class);
        intent.putExtra("html", line);
        startActivity(intent);
    } catch (ClientProtocolException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "client protocol exception", e);
    } catch (IOException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "io exception", e);
    }
}

我将 ReadingView.class 用于我的应用程序中的其他内容,但现在为了这个日志记录目的而劫持了它。它只有一个 onCreate() 方法,如下所示。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.readingview);

    WebView mWebView = (WebView) findViewById(R.id.webview);
    mWebView.getSettings().setJavaScriptEnabled(true);
    //mWebView.loadUrl(getIntent().getExtras().getString("url"));
    mWebView.loadData(getIntent().getExtras().getString("html"), "text/html", "utf-8");
}

另外值得注意的是,在 DDMS 中它只记录一个行输出。我相信这只是因为 html 代码全部作为一行返回。如果我错了,请纠正我。

【问题讨论】:

标签: android post spreadsheet google-forms


【解决方案1】:

所以我终于弄清楚发生了什么。通过对表单 POST url 末尾的手动编码答案进行混淆,我能够发现它在查看源代码时给出的 url 有它自己的编码问题。

以下是来源网址:

<form action="https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&amp;formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&amp;ifq" method="POST" id="ss-form">

但在上面的代码中实际工作需要这样做:

https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ

额外的放大器;是什么搞砸了。无论出于何种原因,它也可以在没有最后一个 &ifq 的情况下工作,所以我把它关掉了。无论如何,这是完整的代码:

private void submitVote(String outcome) {
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ");

    List<BasicNameValuePair> results = new ArrayList<BasicNameValuePair>();
    results.add(new BasicNameValuePair("entry.0.single", cardOneURL));
    results.add(new BasicNameValuePair("entry.1.single", outcome));
    results.add(new BasicNameValuePair("entry.2.single", cardTwoURL));

    try {
        post.setEntity(new UrlEncodedFormEntity(results));
    } catch (UnsupportedEncodingException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "An error has occurred", e);
    }
    try {
        client.execute(post);
    } catch (ClientProtocolException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "client protocol exception", e);
    } catch (IOException e) {
        // Auto-generated catch block
        Log.e("YOUR_TAG", "io exception", e);
    }
}

希望这对尝试使用 Google 电子表格表单的其他人有所帮助。感谢@pandre 为我指明了正确的方向。

【讨论】:

  • 感谢您提出这个问题。我正在尝试做类似的事情,并且是新手开发者,所以请多多包涵。 OnCreate 中的 Web 视图是什么?你是否制作了一个带有文本字段和按钮的原生 Android 表单来提交,然后调用 SubmitVote()?如果是这样,那么 Web 视图的意义何在?
  • 你能告诉我如何找到表单的 URL 吗?
  • 上述示例使用的 Apache HTTP 客户端在 Android 6.0 中为 removedHttpUrlConnection 怎么能做到同样的事情?
【解决方案2】:

在许多情况下,entry.0.single 格式可能不起作用。您必须始终找到正确的元素 id 来创建您的 POST 请求。这个article 提供了通过 Android 应用将数据发布到 Google 文档表的正确方法。

【讨论】:

    【解决方案3】:

    查看Acra 的来源。这会将堆栈跟踪上传到 Google 电子表格。

    【讨论】:

      【解决方案4】:

      您可能没有看到错误,因为您以错误的方式打印异常。
      您正在使用e.printStackTrace();,它没有出现在 DDMS/Logcat 中。

      您应该改用
      Log.e("YOUR_TAG, "An error has occurred", e);

      它将在 DDMS/Logcat 中记录您的错误。您应该会看到异常的堆栈跟踪,它将帮助您了解问题所在。

      编辑: 您检查过client.execute(post); 中返回的内容吗?
      您应该通过以下方式检查 POST 响应中返回的内容:

      HttpResponse httpResponse = client.execute(post);
      

      您还可以在调试模式下运行应用程序并检查它在哪里崩溃/停止

      【讨论】:

      • 我想这会有所帮助吧?我把它放进去,但在 DDMS 中仍然没有得到任何东西。我也更新了我的原始帖子,所以其他人不会关注那个。我只是收到一条有关“窗口已聚焦”的消息,即使没有上述代码,该消息也存在。基本上他们提交投票,然后有两张新照片来投票。会不会是 Google 表单的问题?
      • 我回家后会检查一下。我不确定我实际上应该期待什么响应,因为我的应用程序不需要它。提交时是否有我可以检查的默认表单响应?此外,运行程序时没有崩溃,如果一切正常,它就像一切,但结果永远不会显示在电子表格中。只是想清楚。
      • 好的,我得到一个文本 html 格式的网页。但是,当我尝试将其登录到 DDMS 时,它会以 ... 结尾。我认为这可能只是 DDMS 无法全部显示,所以我尝试让应用程序在 webview 中加载它,但 webview 只返回一个空白的白色屏幕,上面有文本“null”。我将更新我的原始帖子以显示我的日志记录方法。值得注意的是,点击提交后返回的 html 源似乎与通常的感谢页面的 html 源的开头不匹配。
      • 做更多研究,这是试图从 httpResponse 返回的页面。这只是一个通用的错误页面。我在尝试手动弄乱地址栏中的 url 编码时发现它只是为了咧嘴一笑。如果您查看此页面的源代码,它与 DDMS 从响应中截取的 html 字符串相同。仍然不知道从这里到哪里去。 spreadsheets.google.com/spreadsheet/…
      • 我会将您的答案标记为有用,但显然我没有足够的代表来做到这一点。对不起。我在我找到的答案中给了你道具。谢谢。
      【解决方案5】:

      所以 cardOneUrl 是 layout.xml 中的文本编辑字段 "results.add(new BasicNameValuePair("entry.0.single", cardOneURL));"谢谢,乔

      【讨论】:

        猜你喜欢
        • 2012-08-12
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多