Использование Android для отправки в форму Google Spreadsheet
Впервые задал вопрос здесь. Обычно я могу найти свой ответ, не спрашивая, но на этот раз я застрял и не могу понять, чего мне не хватает.
Я просто пытаюсь, чтобы приложение для 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. Когда я на самом деле запускаю программу и нажимаю кнопку, которая выполняет этот код, я вижу задержку, так как прямо сейчас это в потоке пользовательского интерфейса, поэтому я знаю, что он ее выполняет. Кажется, что все работает отлично, но моя таблица вообще не обновляется.
Любые мысли? Я уверен, что это что-то глупое, что мне не хватает, но любая помощь будет оценена.
Здесь обновленный код с большим количеством записей и отладки.
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);
}
}
Я использую ReadView.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-код возвращается как одна строка. Исправьте меня, если я ошибаюсь.
Ответы
Ответ 1
Итак, я, наконец, понял, что происходит. Через messing с ручным кодированием ответы на конец формы 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 для указания меня в правильном направлении.
Ответ 2
Формат, entry.0.single может не работать во многих случаях. Вы всегда должны найти правильный идентификатор элементов для создания запроса POST. Эта статья предоставляет правильный способ публикации данных на листе документов Google через приложение для Android.
Ответ 3
Посмотрите на источник Acra. Это загружает трассировки стека в таблицу Google.
Ответ 4
Вероятно, вы не ошибаетесь, потому что печатаете исключения неправильно.
Вы используете e.printStackTrace();
, который не отображается в DDMS/Logcat.
Вместо этого вы должны использовать
Log.e("YOUR_TAG, "An error has occurred", e);
который запишет вашу ошибку в DDMS/Logcat. Вы должны увидеть stacktrace исключения, и это поможет вам понять, что неправильно.
EDIT:
Вы проверили, что возвращается в client.execute(post);
?
Вы должны проверить, что возвращается в ответ POST, выполнив:
HttpResponse httpResponse = client.execute(post);
Вы также можете запустить приложение в режиме отладки и проверить, где он сбой/остановка
Ответ 5
Итак, cardOneUrl - это текстовые поля редактирования в layout.xml "results.add(новый BasicNameValuePair (" entry.0.single ", cardOneURL)); Спасибо, Джо