I have code to download an XML file that has been sent in a paid application for several years - there was never any problem until I recently saw that it happened with HTC One.
I wonder if there is something that I will miss, or if it should be reported somewhere.
Here is sample code that causes the problem:
package com.lutron.davetest; import java.io.BufferedInputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.view.Menu; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private TextView mainCenterText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainCenterText = (TextView) findViewById(R.id.mainCenterText); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Enter the IP address"); final EditText edit = new EditText(this); builder.setView(edit); builder.setPositiveButton("OK", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mainCenterText.setText(""); String ip = edit.getText().toString(); new DownloadTask().execute(ip); } }); builder.create().show(); } private class DownloadTask extends AsyncTask<String, Void, Void>{ @Override protected Void doInBackground(String... params) { try{ URL url = new URL("http", params[0], 80, "/file.xml"); URLConnection connection = url.openConnection(); InputStream in = new BufferedInputStream(connection.getInputStream()); byte buf[] = new byte[4096]; int len; while((len = in.read(buf)) != -1 ) { final String data = new String(buf, 0, len); runOnUiThread(new Runnable() { @Override public void run() { mainCenterText.append(data); } }); } }catch(Exception e){ e.printStackTrace(); } return null; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } }
What happens is that on every other device, when reading from a stream, you get only the contents of the file.
On HTC One, you will get THIS and then the contents of the file:
onnection: close Last-Modified: ??? Content-Type: text/html
This is with Android 4.1.2.
Is there a way to configure URLConnection to avoid this?
source share