{"id":105,"date":"2015-04-21T09:46:11","date_gmt":"2015-04-21T08:46:11","guid":{"rendered":"http:\/\/android.wp.w3.pt\/?p=105"},"modified":"2016-11-05T09:09:42","modified_gmt":"2016-11-05T08:09:42","slug":"login-http-e-asynctask","status":"publish","type":"post","link":"http:\/\/android.w3.pt\/?p=105","title":{"rendered":"Login, HTTP e AsyncTask"},"content":{"rendered":"<p>Neste artigo, apresenta-se uma comunica\u00e7\u00e3o <strong>http<\/strong> simples para fazer <strong>login<\/strong> num servidor Web. A comunica\u00e7\u00e3o \u00e9 feita dentro de uma thread pr\u00f3pria, utilizando a classe AsyncTask do Android.<\/p>\n<p>A comunica\u00e7\u00e3o HTTP no Android deve ser feita dentro de uma thread para evitar que a aplica\u00e7\u00e3o fique \u201cpresa\u201d \u00e0 espera da resposta do servidor, n\u00e3o permitindo, durante esse tempo, que o utilizador interaja com a mesma.<\/p>\n<p>Para al\u00e9m das classes <strong>HttpRequest<\/strong> e <strong>HttpData<\/strong> (a primeira implementa os m\u00e9todos de invoca\u00e7\u00e3o dos comandos GET e POST; a segunda gere a resposta do servidor que pode ser um bloco de texto ou um ficheiro bin\u00e1rio) que foram utilizadas no \u00faltimo projeto, Utiliza-se tamb\u00e9m a classe PostData que permite fazer pedidos <strong>http<\/strong> diferentes, utilizando a mesma thread, e tratar as respetivas respostas.<\/p>\n<p>Segue-se o c\u00f3digo do ficheiro <strong>activity_login.xml<\/strong>, com o formul\u00e1rio de login:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\n&lt;LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n\u00a0\u00a0\u00a0 xmlns:tools=\"http:\/\/schemas.android.com\/tools\" \r\n    android:layout_width=\"match_parent\"\r\n\u00a0\u00a0\u00a0 android:layout_height=\"match_parent\" \r\n    tools:context=\".Login\"\r\n\u00a0\u00a0\u00a0 android:orientation=\"vertical\"\r\n\u00a0\u00a0\u00a0 &gt;\r\n\r\n\u00a0\u00a0\u00a0 &lt;TextView\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:text=\"Login\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_width=\"fill_parent\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_height=\"wrap_content\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:textSize=\"48sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/&gt;\r\n\u00a0\u00a0\u00a0 &lt;TextView\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:text=\"Username\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_width=\"fill_parent\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_height=\"wrap_content\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:textSize=\"16sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:paddingTop=\"20sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/&gt;\r\n\u00a0\u00a0\u00a0 &lt;EditText\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:id=\"@+id\/user\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_width=\"fill_parent\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_height=\"wrap_content\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:textSize=\"24sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/&gt;\r\n\u00a0\u00a0\u00a0 &lt;TextView\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:text=\"Password\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_width=\"fill_parent\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_height=\"wrap_content\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:textSize=\"16sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:paddingTop=\"20sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/&gt;\r\n\u00a0\u00a0\u00a0 &lt;EditText\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:id=\"@+id\/pass\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_width=\"fill_parent\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_height=\"wrap_content\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:textSize=\"24sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:inputType=\"textPassword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/&gt;\r\n\u00a0\u00a0\u00a0 &lt;Button\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:id=\"@+id\/login\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:text=\"Login\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_width=\"fill_parent\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_height=\"wrap_content\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:textSize=\"24sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:layout_marginTop=\"20sp\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/&gt;\r\n&lt;\/LinearLayout&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo da classe <strong>HttpRequest<\/strong>, com os m\u00e9todos de comunica\u00e7\u00e3o HTTP:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\npackage com.se.login;\r\n\r\nimport java.net.URI;\r\nimport java.net.URISyntaxException;\r\nimport java.util.List;\r\n\r\nimport org.apache.http.HttpResponse;\r\nimport org.apache.http.HttpVersion;\r\nimport org.apache.http.NameValuePair;\r\nimport org.apache.http.client.ClientProtocolException;\r\nimport org.apache.http.client.HttpClient;\r\nimport org.apache.http.client.entity.UrlEncodedFormEntity;\r\nimport org.apache.http.client.methods.HttpGet;\r\nimport org.apache.http.client.methods.HttpPost;\r\nimport org.apache.http.impl.client.DefaultHttpClient;\r\nimport org.apache.http.params.BasicHttpParams;\r\nimport org.apache.http.params.CoreProtocolPNames;\r\nimport org.apache.http.params.HttpConnectionParams;\r\nimport org.apache.http.params.HttpParams;\r\n\r\npublic class HttpRequest {\r\n\u00a0\u00a0\u00a0 public HttpClient httpclient;\r\n\r\n\u00a0\u00a0\u00a0 public HttpRequest() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpParams httpParameters = new BasicHttpParams();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Set the timeout in milliseconds until a connection is established.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ The default value is zero, that means the timeout is not used.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int timeoutConnection = 30000;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Set the default socket timeout (SO_TIMEOUT)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ in milliseconds which is the timeout for waiting for data.\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int timeoutSocket = 60000;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 httpclient = new DefaultHttpClient(httpParameters);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Faz um pedido GET\r\n\u00a0\u00a0\u00a0 public HttpData get(String url){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpData dados = new HttpData();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpGet request = new HttpGet();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 request.setURI(new URI(url));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpResponse resp = httpclient.execute(request);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados.set(resp);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (URISyntaxException e1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e1.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (ClientProtocolException e1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e1.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e1.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return dados;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 public HttpData getImage(String url, List&lt;NameValuePair&gt; vars) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpData dados = new HttpData();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpPost request = new HttpPost(url);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 request.setEntity(new UrlEncodedFormEntity(vars));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpResponse resp = httpclient.execute(request);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados.setImage(resp);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (ClientProtocolException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return dados;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Faz um pedido via POST, com vari\u00e1veis\r\n\u00a0\u00a0\u00a0 public HttpData post(String url, List&lt;NameValuePair&gt; vars){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpData dados = new HttpData();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpPost request = new HttpPost(url);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 request.setEntity(new UrlEncodedFormEntity(vars));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpResponse resp = httpclient.execute(request);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados.set(resp);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (ClientProtocolException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return dados;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Faz um upload de dados bin\u00e1rios via POST\r\n\u00a0\u00a0\u00a0 public HttpData post(String url, String name, String filename, byte[] bin, String type){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpData dados = new HttpData();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpPost request = new HttpPost(url);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SimpleMultipartEntity mpe = new SimpleMultipartEntity();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mpe.addPart(name, filename, bin, type);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 request.setEntity(mpe);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpResponse resp = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resp = httpclient.execute(request);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (ClientProtocolException e1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e1.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e1.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados.set(resp);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return dados;\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo da classe <strong>HttpData<\/strong>, onde ficam os resultados das consultas HTTP:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\npackage com.se.login;\r\n\r\nimport java.io.BufferedReader;\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.io.InputStreamReader;\r\nimport java.util.Hashtable;\r\n\r\nimport org.apache.http.Header;\r\nimport org.apache.http.HttpResponse;\r\n\r\nimport android.graphics.Bitmap;\r\nimport android.graphics.BitmapFactory;\r\nimport android.util.Log;\r\n\r\npublic class HttpData {\r\n\u00a0\u00a0\u00a0 public String content;\r\n\u00a0\u00a0\u00a0 public Hashtable&lt;String,String&gt; cookies;\r\n\u00a0\u00a0\u00a0 public Hashtable&lt;String,String&gt; headers;\r\n\u00a0\u00a0\u00a0 public int statusCode;\r\n\u00a0\u00a0\u00a0 public Bitmap imagem;\r\n\r\n\u00a0\u00a0\u00a0 public HttpData() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 content = \"\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 imagem = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cookies = new Hashtable&lt;String,String&gt;();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 headers = new Hashtable&lt;String,String&gt;();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusCode = 0;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void set(HttpResponse resp) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(resp == null) return;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BufferedReader in = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in = new BufferedReader(new InputStreamReader(resp.getEntity().getContent()));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 StringBuffer sb = new StringBuffer(\"\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String line = \"\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String NL = System.getProperty(\"line.separator\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while ((line = in.readLine()) != null) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(sb.length() != 0) sb.append(NL);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sb.append(line);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 content = sb.toString();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(content.startsWith(\"\u00ef\u00bb\u00bf\")) content = content.substring(3);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.d(\"LOG\", \"HttpData.set(), tamanho de content: \" + content.length());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IllegalStateException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } finally {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (in != null) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Header[] hds = resp.getAllHeaders();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(Header h: hds) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 headers.put(h.getName(), h.getValue());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (h.getName().equals(\"set-cookie\"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cookies.put(h.getName(), h.getValue());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusCode = resp.getStatusLine().getStatusCode();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.d(\"NET\", \"statusCode = \" + statusCode);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void setImage(HttpResponse resp) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(resp == null) return;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 InputStream in = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in = resp.getEntity().getContent();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 imagem = BitmapFactory.decodeStream(in);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.d(\"LOG\", \"HttpData.setImage(), tamanho de content: \" + content.length());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IllegalStateException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } finally {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (in != null) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 in.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Header[] hds = resp.getAllHeaders();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(Header h: hds) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 headers.put(h.getName(), h.getValue());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (h.getName().equals(\"set-cookie\"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cookies.put(h.getName(), h.getValue());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusCode = resp.getStatusLine().getStatusCode();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.d(\"NET\", \"statusCode = \" + statusCode);\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo da classe <strong>SimpleMultipartEntity<\/strong>, para poder submeter ficheiros bin\u00e1rios:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\npackage com.se.login;\r\n\r\nimport java.io.ByteArrayInputStream;\r\nimport java.io.ByteArrayOutputStream;\r\nimport java.io.File;\r\nimport java.io.FileInputStream;\r\nimport java.io.FileNotFoundException;\r\nimport java.io.IOException;\r\nimport java.io.InputStream;\r\nimport java.io.OutputStream;\r\nimport java.util.Random;\r\n\r\nimport org.apache.http.Header;\r\nimport org.apache.http.HttpEntity;\r\nimport org.apache.http.message.BasicHeader;\r\n\r\nimport android.util.Log;\r\n\r\npublic class SimpleMultipartEntity implements HttpEntity {\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Original: http:\/\/blog.rafaelsanches.com\/2011\/01\/29\/upload-using-multipart-post-using-httpclient-in-android\/\r\n\u00a0\u00a0\u00a0 \/\/ Modified by: Alex Banha\r\n\r\n\u00a0\u00a0\u00a0 private final static char[] MULTIPART_CHARS = \"-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 .toCharArray();\r\n\r\n\u00a0\u00a0\u00a0 private String boundary = null;\r\n\r\n\u00a0\u00a0\u00a0 ByteArrayOutputStream out = new ByteArrayOutputStream();\r\n\u00a0\u00a0\u00a0 boolean isSetLast = false;\r\n\u00a0\u00a0\u00a0 boolean isSetFirst = false;\r\n\r\n\u00a0\u00a0\u00a0 public SimpleMultipartEntity() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final StringBuffer buf = new StringBuffer();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final Random rand = new Random();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (int i = 0; i &lt; 30; i++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 buf.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 this.boundary = buf.toString();\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void writeFirstBoundaryIfNeeds(){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(!isSetFirst){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write((\"--\" + boundary + \"\\r\\n\").getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 isSetFirst = true;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void writeLastBoundaryIfNeeds() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(isSetLast){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return ;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write((\"\\r\\n--\" + boundary + \"--\\r\\n\").getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 isSetLast = true;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void addPart(final String key, final String value) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 writeFirstBoundaryIfNeeds();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write((\"Content-Disposition: form-data; name=\\\"\" +key+\"\\\"\\r\\n\").getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(\"Content-Type: text\/plain; charset=UTF-8\\r\\n\".getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(\"Content-Transfer-Encoding: 8bit\\r\\n\\r\\n\".getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(value.getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write((\"\\r\\n--\" + boundary + \"\\r\\n\").getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void addPart(final String key, final String fileName, final InputStream fin){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 addPart(key, fileName, fin, \"application\/octet-stream\");\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void addPart(final String key, final String fileName, final InputStream fin, String type){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 writeFirstBoundaryIfNeeds();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 type = \"Content-Type: \"+type+\"\\r\\n\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write((\"Content-Disposition: form-data; name=\\\"\"+ key+\"\\\"; filename=\\\"\" + fileName + \"\\\"\\r\\n\").getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(type.getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(\"Content-Transfer-Encoding: binary\\r\\n\\r\\n\".getBytes());\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 final byte[] tmp = new byte[4096];\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 int l = 0;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while ((l = fin.read(tmp)) != -1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(tmp, 0, l);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.flush();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } finally {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fin.close();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void addPart(final String key, final String fileName, byte[] dados, String type){\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 writeFirstBoundaryIfNeeds();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 type = \"Content-Type: \"+type+\"\\r\\n\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write((\"Content-Disposition: form-data; name=\\\"\"+ key+\"\\\"; filename=\\\"\" + fileName + \"\\\"\\r\\n\").getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(type.getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(\"Content-Transfer-Encoding: binary\\r\\n\\r\\n\".getBytes());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.write(dados);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 out.flush();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final IOException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void addPart(final String key, final File value) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 addPart(key, value.getName(), new FileInputStream(value));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (final FileNotFoundException e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.e(\"LOG\", e.getMessage(), e);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public long getContentLength() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 writeLastBoundaryIfNeeds();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return out.toByteArray().length;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public Header getContentType() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return new BasicHeader(\"Content-Type\", \"multipart\/form-data; boundary=\" + boundary);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public boolean isChunked() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public boolean isRepeatable() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public boolean isStreaming() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return false;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void writeTo(final OutputStream outstream) throws IOException {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 outstream.write(out.toByteArray());\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public Header getContentEncoding() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return null;\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void consumeContent() throws IOException,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UnsupportedOperationException {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (isStreaming()) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 throw new UnsupportedOperationException(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Streaming entity does not implement #consumeContent()\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public InputStream getContent() throws IOException,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UnsupportedOperationException {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return new ByteArrayInputStream(out.toByteArray());\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo da classe <strong>PostData<\/strong>, com os dados dos pedidos HTTP (URL, vari\u00e1veis e bin\u00e1rios):<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\npackage com.se.login;\r\n\r\nimport java.util.List;\r\n\r\nimport org.apache.http.NameValuePair;\r\n\r\npublic class PostData {\r\n   public String url;\r\n   public List&lt;NameValuePair&gt; dados;\r\n   byte[] binario;\r\n\r\n public PostData(String url, List&lt;NameValuePair&gt; dados, byte[] binario){\r\n    this.url = url;\r\n    this.dados = dados;\r\n    this.binario = binario;\r\n  }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo do ficheiro <strong>AndroidManifest.xml<\/strong>, com as permiss\u00f5es para acesso \u00e0 Internet:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\n&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n\u00a0\u00a0\u00a0 package=\"com.se.login\" &gt;\r\n\r\n\u00a0\u00a0\u00a0 &lt;uses-permission android:name=\"android.permission.INTERNET\" \/&gt;\r\n\r\n\u00a0\u00a0\u00a0 &lt;application\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:allowBackup=\"true\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:icon=\"@mipmap\/ic_launcher\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:label=\"@string\/app_name\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:theme=\"@style\/AppTheme\" &gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;activity\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:name=\".Login\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 android:label=\"@string\/app_name\" &gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;intent-filter&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;action android:name=\"android.intent.action.MAIN\" \/&gt;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;category android:name=\"android.intent.category.LAUNCHER\" \/&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/intent-filter&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/activity&gt;\r\n\u00a0\u00a0\u00a0 &lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo da classe principal, a clase <strong>Login.java<\/strong>:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\npackage com.se.login;\r\n\r\nimport android.os.AsyncTask;\r\nimport android.app.Activity;\r\nimport android.os.Bundle;\r\nimport android.util.Log;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.EditText;\r\nimport android.widget.Toast;\r\n\r\nimport org.apache.http.NameValuePair;\r\nimport org.apache.http.message.BasicNameValuePair;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.List;\r\n\r\n\r\npublic class Login extends Activity {\r\n\r\n\u00a0\u00a0\u00a0 EditText user, pass;\r\n\u00a0\u00a0\u00a0 Button login;\r\n\r\n\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0 protected void onCreate(Bundle savedInstanceState) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 super.onCreate(savedInstanceState);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 setContentView(R.layout.activity_login);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 user = (EditText) findViewById(R.id.user);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pass = (EditText) findViewById(R.id.pass);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 login = (Button) findViewById(R.id.login);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 login.setOnClickListener(new View.OnClickListener() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 public void onClick(View v) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fazLogin();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 });\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public void fazLogin() {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String sUser = user.getText().toString();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String sPass = pass.getText().toString();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 String url = \"http:\/\/escola.w3.pt\/se\/_files\/login.php\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List&lt;NameValuePair&gt; dados = new ArrayList&lt;NameValuePair&gt;();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados.add(new BasicNameValuePair(\"usr\", sUser));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados.add(new BasicNameValuePair(\"psw\", sPass));\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 new Sincro().execute(new PostData(url, dados, null));\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 public class Sincro extends AsyncTask&lt;PostData, Integer, HttpData&gt; {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 protected HttpData doInBackground(PostData... params) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.i(\"LOGGER\", \"Sincro Starting...\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpData dados = null;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 try {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 HttpRequest req = new HttpRequest();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dados = req.post(params[0].url, params[0].dados);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } catch (Exception e) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 e.printStackTrace();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return dados;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 protected void onProgressUpdate(Integer... progress) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @Override\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 protected void onPostExecute(HttpData dados) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Log.i(\"LOGGER\", \"...Done\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Toast.makeText(Login.this, dados.content, Toast.LENGTH_LONG).show();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Segue-se o c\u00f3digo do ficheiro <strong>login.php<\/strong> que est\u00e1 no servidor Web:<\/p>\n<pre style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace;\">\r\n&lt;?php\r\n\r\nif($_POST['usr']=='se' &amp;&amp; $_POST['psw']=='xpto') echo 'OK';\r\nelse echo 'NOT OK';\r\n\r\n?&gt;\r\n<\/pre>\n<hr>\n<p>Nota: a partir da vers\u00e3o 23 do sdk, o Android deixou de suportar o HttpClient. A partir desta vers\u00e3o, h\u00e1 as op\u00e7\u00f5es seguintes, para comunicar pela rede:<\/p>\n<ul>\n<li>usar a classe URLConnection<\/li>\n<li>compilar para a vers\u00e3o 22 do sdk (compile &#8216;com.android.support:appcompat-v7:22.2.0&#8217;)<\/li>\n<li>ou, no AndroidStudio, com a vers\u00e3o 23, colocar no gradle: android { useLibrary &#8216;org.apache.http.legacy&#8217; }<\/li>\n<li>ou, no Eclipse, com a vers\u00e3o 23, adicionar a biblioteca org.apache.http.legacy.jar, que est\u00e1 em Android\/Sdk\/platforms\/android-23\/optional, \u00e0s depend\u00eancias do projeto<\/li>\n<li>importar a biblioteca <a href=\"http:\/\/hc.apache.org\/downloads.cgi\">HttpClient jar<\/a> para o projeto<\/li>\n<\/ul>\n<p>(ver mais pormenores <a href=\"http:\/\/stackoverflow.com\/questions\/32153318\/httpclient-wont-import-in-android-studio\">aqui<\/a> e <a href=\"http:\/\/stackoverflow.com\/questions\/32328347\/how-to-use-legacy-apache-in-eclipse-in-order-to-support-android-m\">aqui<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Neste artigo, apresenta-se uma comunica\u00e7\u00e3o http simples para fazer login num servidor Web. A comunica\u00e7\u00e3o \u00e9 feita dentro de uma thread pr\u00f3pria, utilizando a classe AsyncTask do Android. A comunica\u00e7\u00e3o HTTP no Android deve ser feita dentro de uma thread para evitar que a aplica\u00e7\u00e3o fique \u201cpresa\u201d \u00e0 espera da resposta do servidor, n\u00e3o permitindo, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/105"}],"collection":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=105"}],"version-history":[{"count":25,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/105\/revisions"}],"predecessor-version":[{"id":167,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/105\/revisions\/167"}],"wp:attachment":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=105"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}