15

こちらで初めて質問します。通常、質問しなくても答えを見つけることができますが、今回は行き詰まって何が欠けているのかわかりません。

Android アプリで Web サイトのフォームに記入して送信しようとしています。送り返されるデータをアプリで処理する必要はありません。フォームに入力して送信するだけです。基本的に、投票アプリの結果を収集しようとしています。フォームの送信は簡単だと思ったので、Google スプレッドシートを作成してフォームを作成しました。Android アプリをフォームにポイントすると、スプレッドシートにすべてのデータが表示され、後で表示できるようになると考えました。ただし、Android アプリで実際にフォームに入力することはできません。ここにリソースがあります。

スプレッドシート

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 では行の 1 つの出力のみがログに記録されることにも注意してください。これは、html コードがすべて 1 行で返されるためだと思います。私が間違っている場合は修正してください。

4

5 に答える 5

18

それで私はついに何が起こっているのかを理解しました。フォームのPOSTurlの最後に手動で回答をエンコードすることで、ソースを表示したときに表示される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);
    }
}

Hope this helps someone else when trying to work with Google Spreadsheet Forms. And thanks to @pandre for pointing me in the right direction.

于 2011-06-02T00:20:15.030 に答える
5

多くの場合、entry.0.single の形式は機能しない可能性があります。POST リクエストを作成するには、常に要素の適切な ID を見つける必要があります。この記事では、Android アプリを介して Google ドキュメント シートにデータを投稿する適切な方法について説明します。

于 2015-02-23T10:08:30.773 に答える
2

Acraのソースを見てください。これにより、スタック トレースが Google スプレッドシートにアップロードされます。

于 2011-06-01T23:55:20.697 に答える
1

間違った方法で例外を出力しているため、おそらくエラーは発生していません。DDMS/Logcat に表示されない
ものを使用しています。e.printStackTrace();

代わりに使用する必要があります
Log.e("YOUR_TAG, "An error has occurred", e);

これにより、エラーが DDMS/Logcat に記録されます。例外のスタック トレースが表示され、何が問題なのかを理解するのに役立ちます。

編集: で返されるものを確認しましたclient.execute(post);か?
次のようにして、POST 応答で何が返されているかを確認する必要があります。

HttpResponse httpResponse = client.execute(post);

アプリケーションをデバッグモードで実行して、クラッシュ/停止している場所を確認することもできます

于 2011-05-30T11:14:20.550 に答える
0

したがって、cardOneUrl は、layout.xml のテキスト編集フィールドです "results.add(new BasicNameValuePair("entry.0.single", cardOneURL));" ありがとう、ジョー

于 2012-10-21T00:34:50.353 に答える