Сохранить данные из файла XML, когда Интернет доступен в Android Studio
Я делаю app
в android studio
в котором я получаю данные из JSON files
и заполнить его в счетчик. Ниже мое изображение приложения
У меня есть два варианта сохранения данных при следующих условиях.
- Когда интернет отключен, данные будут сохранены в локальном
xml
файл. - Когда интернет в приложении
will
проверьте наличие соединения и, если оно доступно, он проверит файл и затем загрузит его на сервер.
На данный момент я могу реализовать обе точки по отдельности, т.е. я создал метод, который будет проверять подключение к Интернету. Передал этот метод в условие и, если соединение доступно, он сохранит данные в локальный файл xml
файл и, если Интернет не доступен, то он будет сохранять новые данные только на сервер.
Мой скрипт ниже
require_once ('config.php');
$return_arr = array();
$ref_no = ($_POST['ref_no']);
$meter_type = ($_POST['meter_type']);
$lattitude = ($_POST['lattitude']);
$longitude = ($_POST['longitude']);
$site_status = ($_POST['site_status']);
$comm_status = ($_POST['comm_status']);
$pole_type = ($_POST['pole_type']);
$meter_placement = ($_POST['meter_placement']);
$date_time = ($_POST['datetime']);
$record_save = "INSERT INTO `survey`(`s_id`,`ref_no`,`meter_type`, `lattitude`,`longitude`,`site_status`,`comm_status`,`pole_type`,`meter_placement`, `datetime`) values (NULL,'".$ref_no."','".$meter_type."','".$lattitude."','".$longitude."','".$site_status."','".$comm_status."','".$pole_type."','".$meter_placement."','".$date_time."')";
mysqli_query ($con,$record_save);
$row_array['errorcode1'] = 1;
Я сохраняю все данные в строковом формате, как показано ниже
String DateTime,refr_no, meter_type, Latitude, Longitude, site_status, comm_status, pole_type,rb_text;
На нажатие кнопки я спрашиваю permission
для сохранения файла в локальном хранилище, а затем на permission granted
я разместил чеки, как показано ниже
btn_save_data.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(refr_no == "Select a reference number" || meter_type == "Select Meter Type" || Latitude == " " || Longitude == ""
|| site_status == "Select Site Status" || comm_status == "" || pole_type == "Select pole type" || DateTime == "" )
{
Toast.makeText(MainActivity.this, " Data not saved.... you must be missing some thing.. Please check!!! " , Toast.LENGTH_LONG ).show();
}else {
new TedPermission(MainActivity.this)
.setPermissionListener(ListenerSaveData)
.setRationaleMessage("This activity will need your permission to save file ")
.setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.check();
Toast.makeText(MainActivity.this,"Data saved successfully", Toast.LENGTH_SHORT).show();
}
}
});
final PermissionListener ListenerSaveData = new PermissionListener() {
@Override
public void onPermissionGranted() {
if(refr_no == "Select a reference number" || meter_type == "Select Meter Type" || Latitude == " " || Longitude == ""
|| site_status == "Select Site Status" || comm_status == "" || pole_type == "Select pole type" || DateTime == "" )
{
Toast.makeText(MainActivity.this, " Data not saved.... you must be missing some thing.. Please check!!! " , Toast.LENGTH_LONG ).show();
}else {
if (!isOnline()) {
try {
File file = new File(getApplicationContext().getExternalFilesDir(null), filename);
file.createNewFile();
FileOutputStream fileos = new FileOutputStream(file, true);
XmlSerializer xmlSerializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
xmlSerializer.setOutput(writer);
xmlSerializer.startDocument("UTF-8", true);
xmlSerializer.startTag(null, "record");
xmlSerializer.startTag(null, "ref_no");
xmlSerializer.text(refr_no);
xmlSerializer.endTag(null, "ref_no");
xmlSerializer.startTag(null, "meter_type");
xmlSerializer.text(meter_type);
xmlSerializer.endTag(null, "meter_type");
xmlSerializer.startTag(null, "lat");
xmlSerializer.text(Latitude);
xmlSerializer.endTag(null, "lat");
xmlSerializer.startTag(null, "long");
xmlSerializer.text(Longitude);
xmlSerializer.endTag(null, "long");
xmlSerializer.startTag(null, "site_status");
xmlSerializer.text(site_status);
xmlSerializer.endTag(null, "site_status");
xmlSerializer.startTag(null, "communication_status");
xmlSerializer.text(comm_status);
xmlSerializer.endTag(null, "communication_status");
xmlSerializer.startTag(null, "pole_type");
xmlSerializer.text(pole_type);
xmlSerializer.endTag(null, "pole_type");
xmlSerializer.startTag(null, "meter_placement");
xmlSerializer.text(rb_text);
xmlSerializer.endTag(null, "meter_placement");
xmlSerializer.startTag(null, "date_time");
xmlSerializer.text(DateTime);
xmlSerializer.endTag(null, "date_time");
xmlSerializer.endTag(null, "record");
xmlSerializer.endDocument();
xmlSerializer.flush();
String dataWrite = writer.toString();
fileos.write(dataWrite.getBytes());
fileos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dd_ref.setSelection(0);
dd_pole_type.setSelection(0);
dd_site_status.setSelection(0);
dd_m_type.setSelection(0);
_latitude.setText("");
_longitude.setText("");
comment.setText("");
DateTime = "";
refr_no = "";
Latitude = "";
Longitude = "";
site_status = "";
comm_status = "";
pole_type = "";
rb_text = "";
rg_meter_placement.clearCheck();
}else if (isOnline())
{
new SaveData().execute(refr_no,meter_type,Latitude,Longitude,site_status,comm_status,pole_type,rb_text,DateTime);
}
}
}
@Override
public void onPermissionDenied(ArrayList<String> deniedPermissions) {
}
};
Здесь isOnline
Метод проверки подключения к Интернету, как показано ниже
protected boolean isOnline() {
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if(netInfo != null && netInfo.isConnectedOrConnecting())
{
Toast.makeText(MainActivity.this, "Internet is Connected", Toast.LENGTH_SHORT).show();
return true;
}
else {
Toast.makeText(MainActivity.this, "Internet is NOT Connected", Toast.LENGTH_SHORT).show();
return false;
}
}
За SaveData()
метод код ниже
private class SaveData extends AsyncTask<String, Void, String>{
ProgressDialog mProgressDialog;
String res;
@Override
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(MainActivity.this,
"", "Saving Data Please wait...");
mProgressDialog.show();
}
@Override
protected String doInBackground(String... params) {
res = null;
PutUtility put = new PutUtility();
put.setParam("ref_no",params[0].toString());
put.setParam("meter_type", params[1].toString());
put.setParam("lattitude", params[2].toString());
put.setParam("longitude", params[3].toString());
put.setParam("site_status",params[4].toString());
put.setParam("comm_status",params[5].toString());
put.setParam("pole_type",params[6].toString());
put.setParam("meter_placement",params[7].toString());
put.setParam("datetime",params[8].toString());
try {
res = put.postData("http://192.168.100.12:8000/new/post_data.php");
Log.v("res", res);
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
protected void onPostExecute(String res) {
if(refr_no == "Select a reference number" || meter_type == "Select Meter Type" || Latitude == " " || Longitude == ""
|| site_status == "Select Site Status" || comm_status == "" || pole_type == "Select pole type" || DateTime == "" )
{
Toast.makeText(MainActivity.this, " Data not saved.... you must be missing some thing.. Please check!!! " , Toast.LENGTH_LONG ).show();
}else {
Toast.makeText(getApplicationContext(), " Data Saved Successfully ", Toast.LENGTH_SHORT).show();
dd_ref.setSelection(0);
dd_pole_type.setSelection(0);
dd_site_status.setSelection(0);
dd_m_type.setSelection(0);
_latitude.setText("");
_longitude.setText("");
comment.setText("");
DateTime = "";
refr_no = "";
Latitude = "";
Longitude = "";
site_status = "";
comm_status = "";
pole_type = "";
rb_text = "";
rg_meter_placement.clearCheck();
}
mProgressDialog.dismiss();
Intent intent = getIntent();
finish();
startActivity(intent);
}
}
В то время как PutUtility
класс ниже
public class PutUtility {
private Map<String, String> params = new HashMap<>();
private static HttpURLConnection httpConnection;
private static BufferedReader reader;
private StringBuffer response;
public void setParam(String key, String value) {
params.put(key, value);
}
public String postData(String Url) {
StringBuilder sb = new StringBuilder();
for (String key : params.keySet()) {
String value = null;
value = params.get(key);
if (sb.length() > 0) {
sb.append("&");
}
sb.append(key + "=" + value);
}
try {
// Defined URL where to send data
URL url = new URL(Url);
URLConnection conn = null;
conn = url.openConnection();
// Send POST data request
httpConnection = (HttpURLConnection) conn;
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
httpConnection.setRequestMethod("POST");
httpConnection.setDoInput(true);
httpConnection.setDoOutput(true);
OutputStreamWriter wr = null;
wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(sb.toString());
wr.flush();
BufferedReader in = new BufferedReader(
new InputStreamReader(httpConnection.getInputStream()));
String inputLine;
response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return response.toString();
}}
Я хочу реализовать второй пункт, что всякий раз, когда app
После этого все данные в файле (XML-файл) будут загружены на сервер.
Как новичок, я понятия не имею, как это сделать.
Любая помощь будет высоко оценен.