Как в Android Studio передавать данные на сервер в интернете
Три поста назад я показал, как в Android Studio хранить локальные настройки (ФИО, должность и телефон спонсора - https://ds-release.ru/kak-rabotat-s-bazoj-dannyx-sqlite-v-android-studio/ ) в базе SQLite
А как передавать данные на центральный сервер приложения в интернете?
В данном примере сервер будет на php, но можно любой, данные будут передаваться на сервер методом POST.
Сначала в AndroidManifest.xml добавим строку
< uses -permission android:name="android.permission.INTERNET">
В activity_main.xml располагаем аналогичный (как в примере с SQLite) код
< ?xml version="1.0" encoding="utf-8"?>
А вот в кнопке «Сохранить» напишем не сохранение в локальную SQLite, а передачу информации о спонсоре на сервер.
Для этого можно использовать, например, POST запрос с передачей параметров.
Используем асинхронное соединение с AsyncTask.
В файле MainActivity пишем такой код:
package ru.ds_release.database; /** * Created by Sergey on 08.05.2017. */ import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MainActivity extends AppCompatActivity { public static String fio_in = ""; public static String dol_in = ""; public static String tel_in = ""; public static String server = "ds-release.ru"; public EditText fio; public EditText dol; public EditText tel; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //сначала обратимся к нашим полям и кнопке Button btn = (Button) findViewById(R.id.button1); fio = (EditText) findViewById(R.id.editText1); dol = (EditText) findViewById(R.id.editText2); tel = (EditText) findViewById(R.id.editText3); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { fio_in = fio.getText().toString(); dol_in = dol.getText().toString(); tel_in = tel.getText().toString(); try { new SendData().execute(); } catch (Exception e) { } } }); } class SendData extends AsyncTask<Void, Void, Void> { String resultString = null; @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Void doInBackground(Void... params) { try { String myURL = "https://"+server+"/server.php"; String parammetrs = "name="+fio_in+"&dol="+dol_in+"&tel="+tel_in; byte[] data = null; InputStream is = null; try { URL url = new URL(myURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", "" + Integer.toString(parammetrs.getBytes().length)); conn.setDoOutput(true); conn.setDoInput(true); // конвертируем передаваемую строку в UTF-8 data = parammetrs.getBytes("UTF-8"); OutputStream os = conn.getOutputStream(); // передаем данные на сервер os.write(data); os.flush(); os.close(); data = null; conn.connect(); int responseCode= conn.getResponseCode(); // передаем ответ сервер ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (responseCode == 200) { // Если все ОК (ответ 200) is = conn.getInputStream(); byte[] buffer = new byte[8192]; // размер буфера // Далее так читаем ответ int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { baos.write(buffer, 0, bytesRead); } data = baos.toByteArray(); resultString = new String(data, "UTF-8"); // сохраняем в переменную ответ сервера, у нас "OK" } else { } conn.disconnect(); } catch (MalformedURLException e) { //resultString = "MalformedURLException:" + e.getMessage(); } catch (IOException e) { //resultString = "IOException:" + e.getMessage(); } catch (Exception e) { //resultString = "Exception:" + e.getMessage(); } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); Toast toast = Toast.makeText(getApplicationContext(), "Данные переданы!", Toast.LENGTH_SHORT); } } }
Если на сервере будет, например, php скрипт server.php такого содержания
<? /* Получаем значения переменных, переданных методом POST*/ $name = $_POST['name']; $dol = $_POST['dol']; $tel = $_POST['tel']; /* создать соединение с заданными ранее именем сервера MySQL, логином и паролем*/ mysql_connect($hostname,$username,$password) OR DIE("No connection"); /* выбрать базу данных с ранее заданным именем. Если произойдет ошибка - вывести ее */ mysql_select_db($dbName) or die(mysql_error()); /* Вставляем в таблицу переданные значения*/ $query = "INSERT INTO DATA VALUES('$name', '$dol', '$tel' )"; /* Выполнить запрос. Если произойдет ошибка - вывести ее. */ mysql_query($query) or die(mysql_error()); echo 'OK'; /* Закрыть соединение */ mysql_close(); ?>
Он запишет переданные в переменных данные в базу MySQL в таблицу DATA значения имени, должности и телефона.
Дистрибутив можно скачать по ссылке https://ds-release.ru/AndroidPOST.rar
Добрый день! Использую ваш код как исходник для своего приложения.
Я разрабатываю приложение WI-FI сканер, который после сканирования отправляет данные на сервер (данные такого типа имя сети, тип защиты, уровень сигнала, аппаратный адрес маршрутизатора) и при тестировании сервер не реагирует на то что я отправляю. На какой версии android работало у вас?
Подскажите пожалуйста причину?
Программирую недавно столкнулся вот с такой проблемой
Работало на всех аппаратах, на которых тестировал, андроид с 4 по 7
А Вы уверены, что проблема именно в версии андроида, а не на стороне веб сервера? Запускайте отладку, смотрите что передаете на сервер, со стороны сервера что на него приходит, думаю, разберетесь
Сделайте урок о том, как принимать данные с сервера. Спасибо
resultString = new String(data, "UTF-8"); // сохраняем в переменную ответ сервера, у нас "OK"
Вот и приняли данные с сервера :).
А потом с этим resultString можете делать, что хотите.