Использование Android для отправки в форму Google Spreadsheet
Первый раз задаю вопрос здесь. Обычно я могу найти свой ответ без необходимости спрашивать, но на этот раз я застрял и не могу понять, что мне не хватает.
Я просто пытаюсь, чтобы мое приложение для Android заполнило форму на веб-сайте и отправило ее. Мне не нужно приложение, чтобы делать что-либо с данными, отправляемыми обратно, просто заполните форму и отправьте ее. В основном я пытаюсь собрать результаты голосования приложения. Я думал, что отправка формы будет простой, поэтому я создал таблицу 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. Когда я на самом деле запускаю программу и нажимаю кнопку, которая выполняет этот код, я вижу задержку, поскольку сейчас она находится в потоке пользовательского интерфейса, поэтому я знаю, что она выполняется. Похоже, что все работает отлично, но моя таблица не обновляется вообще.
Какие-нибудь мысли? Я уверен, что это что-то глупое, что я скучаю, но любая помощь будет оценена.
Вот обновленный код с большим количеством журналирования и отладки.
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 {
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-код возвращается все в одну строку. Поправьте меня если я ошибаюсь.
5 ответов
Итак, я наконец понял, что происходит. Путем возиться с ручным кодированием ответов в конце формы POST url я смог обнаружить, что URL, который он давал при просмотре источника, имел собственные проблемы с кодировкой.
Вот URL из источника:
<form action="https://spreadsheets.google.com/spreadsheet/formResponse?hl=en_US&formkey=dDlwZzh4bGFvNFBxUmRsR0d2VTVhYnc6MQ&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 за то, что он указал мне правильное направление.
Формат entry.0.single может не работать во многих случаях. Вы всегда должны найти правильный идентификатор элементов для создания вашего запроса POST. Эта статья предоставляет правильный способ публикации данных на листе документов Google с помощью приложения для Android.
Посмотрите на источник для Acra. Это загружает трассировки стека в электронную таблицу Google.
Вы, вероятно, не видите ошибки, потому что вы печатаете исключения неправильно.
Ты используешь e.printStackTrace();
который не появляется в DDMS/Logcat.
Вы должны использовать вместоLog.e("YOUR_TAG, "An error has occurred", e);
который будет регистрировать вашу ошибку в DDMS/Logcat. Вы должны увидеть трассировку стека исключения, и это поможет вам понять, что не так.
РЕДАКТИРОВАТЬ: Вы проверили, что возвращается в client.execute(post);
?
Вы должны проверить, что возвращается в ответе POST, выполнив:
HttpResponse httpResponse = client.execute(post);
Вы также можете запустить приложение в режиме отладки и проверить, где происходит сбой / остановка
Поэтому cardOneUrl - это поля для редактирования текста в layout.xml "results.add(new BasicNameValuePair("entry.0.single", cardOneURL));" Спасибо джо