I need to send a file and some data to PHP server.I am using a thread for that and a service that executes every 15 min.It is working fine when network is available.But when not in network it stops sending the file (if the size of file is relatively bigger).Upon applying logs I got to see that ,the respnse from the server is not fetched.And it got struk.Moreover it is sending Unknownhost exception when trying to send the file for first time.What could be the problem?please help.
Here is the code:-
public void run(){
while (keepRunning){
isRunning = true;
SystemClock.sleep(900000);
File tempFile = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "barcode_log");
File tempFile1 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/", "data_log.txt");
if(tempFile.exists())
{
Log.d(TAG," in keep running");
String[] files = (new File(Environment.getExternalStorageDirectory() + PATH)).list();
Log.d(TAG," below file list");
SimpleDateFormat df3 = new SimpleDateFormat("yyyyMMdd_HHmmss");
Date curDate = new Date();
String s= "data_log";//df3.format(curDate);
Log.d("log",files[0]);
File file = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/","barcode_log");
String new_file_name =s+".txt";
// File (or directory) with new name
File file2 = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/",new_file_name);
// Rename file (or directory)
if(!tempFile1.exists()){
boolean success = file.renameTo(file2);
Log.d(TAG," file name created");
if (success) {
// File was not successfully renamed
Log.d(TAG," file rename success");
}
else
{
Log.d(TAG," file not rename success");
}
}
ts.writeBarcodeToFile(" S L", "");
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
String pathToOurFile = Environment.getExternalStorageDirectory() + "/Android/data/com.wherephone.helloandroid/log_files/"+new_file_name;//zipName;
String urlServer = "http://xyz.com/xyz.php?fname="+s+".txt";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "V2ymHFg03ehbqgZCaKO6jy";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 2*1024*1024;
FileInputStream fileInputStream=null;
try
{
ts.writeBarcodeToFile(" in try sl", "");
fileInputStream = new FileInputStream(new File(pathToOurFile) );
InetAddress iAddr = InetAddress.getByName("http://xyz.com");
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
connection.setConnectTimeout(20000);
outputStream = new DataOutputStream( connection.getOutputStream() );
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + pathToOurFile +"\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
ts.writeBarcodeToFile("before while sl ", "");
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
ts.writeBarcodeToFile("after while sl ", "");
// Responses from the server (code and message)
try{
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
if(serverResponseCode==200)
{
ts.writeBarcodeToFile("in if server response ", "");
//ts.writeBarcodeToFile("L S", "");
tempFile1.delete();
}
else
{
ts.writeBarcodeToFile("in else server response ", "");
ts.writeBarcodeToFile(serverResponseCode+"", "");
}
}
catch(Exception e)
{
try{
outputStream.flush();
outputStream.close();
}
catch(Exception ex)
{
}
ts.writeBarcodeToFile("in url catch response "+e.toString(), "");
connection.disconnect();
}
ts.writeBarcodeToFile("after server sl ", "");
fileInputStream.close();
outputStream.flush();
outputStream.close();
ts.writeBarcodeToFile("after close sl ", "");
}
catch (java.net.SocketTimeoutException e) {
try{
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch(Exception ex)
{
}
ts.writeBarcodeToFile("in socketex sl "+e.toString(), "");
connection.disconnect();
}
catch (java.io.IOException e)
{
try{
fileInputStream.close();
outputStream.flush();
outputStream.close();
connection.disconnect();
}
catch(Exception ex)
{
}
ts.writeBarcodeToFile("in ioex sl "+e.toString(), "");
}
catch (Exception ex)
{
try{
fileInputStream.close();
outputStream.flush();
outputStream.close();
}
catch(Exception exy)
{
}
ts.writeBarcodeToFile("in catch sl "+ex.toString(), "");
connection.disconnect();
//Exception handling
}
//System.gc();
}
}
isRunning = false;
}
This issue is related to the connectivity. i have also seen when we are on the wifi, we haven't hit an unknown host exception error (except when I unplugged the device). We're hitting unknown host exception errors when the device is solely on the 3g/4g.
You can try resumable support for upload similar thread resume uploads using HTTP?
or write your own protocol (chunk uploads).
You need to use AsyncTask for network operations for android versions 3.x and above..You can not use network operations in main thread....and If file size is big you may have to use wake_lock on service....and if network is not available than simply close your AsyncTask and than again check after 15 min as you are saying in service...use this code for checking network availability in AsyncTask
public boolean isOnline() {
if(MyService.CONTEXT !=null){
ConnectivityManager cm = (ConnectivityManager) MyService.CONTEXT.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
}
return false
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With