acesso a internet - facombacala/android/10 - acessoweb.pdf · distribuídos desenvolvida pelo roy...

Post on 22-Jul-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Acesso a Internet

Acesso a Rede • Para escrever uma aplicação que suporte

acesso à rede, o manifesto deve ter as permissões e filtros adequados.

• android.permission.INTERNET

• Permite abrir sockets de rede.

• android.permission.ACCESS_NETWORK_STATE

• permite para acessar informações sobre redes.

• ACTION_MANAGE_NETWORK_USAGE

• (introduzido no Android 4.0) indica que seu aplicativo define uma atividade que oferece opções para controlar o uso de dados.

2

3

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.android.networkusage"

...>

<uses-sdk android:minSdkVersion="4"

android:targetSdkVersion="14" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application

...>

...

<activity android:label="SettingsActivity" android:name=".SettingsActivity">

<intent-filter>

<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

</application>

</manifest>

Acesso à Internet

• Sockets

• Utilizar apenas quando for criado protocolo próprio

• Protocolo HTTP

• Permite usar APIs prontas

• java.net

• Apache Jakarta Commons

• WebServices

• REST

• SOAP 4

Sockets

• Conexão com a Internet de baixo nível.

• Apenas TCP/IP e UDP

• Classes

• Socket

• DataOutputStream

• DataInputStream

5

HTTP API

• Classes

• HttpClient

• HttpGet, HttpPost

• HttpResponse

• HttpEntity

• Exemplo: HttpClient

6

HTTP • DefaultHttpClient

• Projeto Apache.

• AndroidHttpClient:

• subtipo do DefaultHttpClient já configurado para valores otimizados no Android.

• não é mais recomendado utilizar estas classes, porque a equipe do Google não dá manutenção a essa implementação.

• HttpUrlConnection,

• que é desenvolvido e suportado pelo Google.

7

Exemplo

8

JSON x XML

• JSON e XML são formatos para a notação de dados a serem transmitidos;

• A maior e mais importante diferença entre eles nesse momento, é que o XML acaba ocupando muito mais espaço que o JSON quando representam o mesmo objeto.

• XML usa uma tag para identificar o inicio e o final de cada nó.

• O JSON é fortemente recomendado quando estamos falando de dispositivos móveis, por consumir menos banda da conexão de internet do usuário. 9

10

JSON (JavaScript Object Notation)

• JSON ganhou muita força como o formato mais utilizado no retorno de webservices, devido a sua simplicidade em comparação com XML.

• Android possui bibliotecas padrão para lidar com JSON:

• JSONObject: lida com um objeto em JSON e

• JSONArray: usada em arrays de objetos JSO

11

Transformando JSON em Objetos Java (Native JSON)

12

{

"cpf": "111222333-00",

"endereco": "Rua das ruas, 9",

"id": "1",

"nome": "Alexandre Dumas"

}

Transformando JSON em Objetos Java (Google GSON)

13

{

"cpf": "111222333-00",

"endereco": "Rua das ruas, 9",

"id": "1",

"nome": "Alexandre Dumas"

}

JSON (JavaScript Object Notation)

• JSON ganhou muita força como o formato mais utilizado no retorno de webservices, devido a sua simplicidade em comparação com XML.

• Android possui bibliotecas padrão para lidar com JSON.Existem duas classes que são utilizadas com este propósito, JSONObject e JSONArray.

• A primeira serve para lidar com umobjeto em JSON, enquanto a segunda é usada em arrays

• de objetos JSON.

14

ExemploJSON

{ "id": "0001", "name": "Curso de Android", "about": "www.facom.ufu.br - contato: Prof. Bacalá", "info": "Programação para Dispositivos Móveis usando Android", "location": { "city": "Uberlândia", "country": "Brasil", "street": "Campus Santa Mônica - Lab B4 - Bloco B", "zip": "38400.000" }, "website": "http://www.facom.ufu.br/~bacala/ANDROID", }

15

Exemplo TextView nameText = ( TextView ) findViewById (R.id.name_text ); TextView siteText = ( TextView ) findViewById (R.id.site_text ); TextView addressText = ( TextView ) findViewById (R.id.address_text ); TextView cityText = ( TextView ) findViewById (R.id.city_text ); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll()-.build(); StrictMode.setThreadPolicy ( policy ); String response = makeRequest ("http://www.facom.ufu.br/~bacala/ANDROID/exemploJSON); try { JSONObject json = new JSONObject ( response ); String name = json.getString ("name"); String site= json.getString (“website"); String address = json.getJSONObject ("location").getString ("street"); String city = json.getJSONObject ("location").getString ("city"); nameText.setText ( name ); siteText.setText ( getString (R.string.website_label , site)); addressText.setText ( getString (R.string.address_label , address )); cityText.setText ( getString (R.string.city_label , city )); } catch ( JSONException e) { e.printStackTrace (); }

16

makeRequest

private String makeRequest ( String urlAddress ) { HttpURLConnection con = null ; URL url = null ; String response = null ; try { url = new URL ( urlAddress ); con = ( HttpURLConnection ) url.openConnection (); response = readStream ( con.getInputStream ()); } catch ( Exception e) { e.printStackTrace (); } finally { con.disconnect (); } return response ; }

17

readStream private String readStream ( InputStream in) { BufferedReader reader = null ; StringBuilder builder = new StringBuilder (); try { reader = new BufferedReader (new InputStreamReader (in)); String line = null ; while (( line = reader.readLine ()) != null ) { builder.append ( line + "\n"); } } catch ( IOException e) { e.printStackTrace (); } finally { if ( reader != null ) { try { reader.close (); } catch ( IOException e) { e.printStackTrace (); } } } return builder.toString (); }

18

Executando operações de rede em um segmento separado

• Operações de rede podem implicar em atrasos imprevisíveis. Para evitar que isso cause uma má impressão do usuário, sempre execute operações de rede em um segmento separado da UI.

• O AsyncTask fornece uma das formas mais simples para disparar uma nova tarefa a partir do segmento.

19

AsyncTask

• Encapsula em uma interface simples o uso de threads.

• Deve implementar obrigatoriamente o método doInBackground(), que é exatamente a tarefa que está sendo executada em background.

• Caso necessário alguma atualização na interface, é só sobrescrever o método onPostExecute(). Tudo que estiver dentro deste método é executado na UI thread.

• O método onPreExecute() é executado antes do doInBackground() e também é executado na UI thread.

20

Usando AsyncTask

• No trecho a seguir, o myClickHandler() chama DownloadWebpageTask().execute (stringUrl)

• DownloadWebpageTask é uma subclasse de AsyncTask e implementa as seguintes:

• doInBackground(): chama downloadURL() que obtém e processa o conteúdo da página web, retornando uma String.

• OnPostExecute (): pega a String retornada e exibe na UI.

21

22

public class HttpExampleActivity extends Activity {

private static final String DEBUG_TAG = "HttpExample";

private EditText urlText;

private TextView textView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

urlText = (EditText) findViewById(R.id.myUrl);

textView = (TextView) findViewById(R.id.myText);

}

// When user clicks button, calls AsyncTask.

// Before attempting to fetch the URL, makes sure that there is a network

connection.

public void myClickHandler(View view) {

// Gets the URL from the UI's text field.

String stringUrl = urlText.getText().toString();

ConnectivityManager connMgr = (ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.isConnected()) {

new DownloadWebpageTask().execute(stringUrl);

} else {

textView.setText("No network connection available.");

}

}

23

// Uses AsyncTask to create a task away from the main UI thread. This task takes a

// URL string and uses it to create an HttpUrlConnection. Once the connection

// has been established, the AsyncTask downloads the contents of the webpage as

// an InputStream. Finally, the InputStream is converted into a string, which is

// displayed in the UI by the AsyncTask's onPostExecute method.

private class DownloadWebpageTask extends AsyncTask<String,Void,String> {

@Override

protected String doInBackground(String... urls) {

// params comes from the execute() call: params[0] is the url.

try {

return downloadUrl(urls[0]);

} catch (IOException e) {

return "Unable to retrieve web page. URL may be invalid.";

}

}

// onPostExecute displays the results of the AsyncTask.

@Override

protected void onPostExecute(String result) {

textView.setText(result);

}

}

...

24

// Given a URL, establishes an HttpUrlConnection and retrieves

// the web page content as a InputStream, which it returns as

// a string.

private String downloadUrl(String myurl) throws IOException {

InputStream is = null;

// Only display the first 500 characters of the retrieved

// web page content.

int len = 500;

try {

URL url = new URL(myurl);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setReadTimeout(10000 /* milliseconds */);

conn.setConnectTimeout(15000 /* milliseconds */);

conn.setRequestMethod("GET");

conn.setDoInput(true);

// Starts the query

conn.connect();

int response = conn.getResponseCode();

Log.d(DEBUG_TAG, "The response is: " + response);

is = conn.getInputStream();

// Convert the InputStream into a string

String contentAsString = readIt(is, len);

return contentAsString;

// Makes sure that the InputStream is closed after the app is

// finished using it.

} finally {

if (is != null) {

is.close();

}

}

}

Verificando a conexão de rede

• Antes de seu aplicativo tenta se conectar à rede, ele deve verificar para ver se uma conexão de rede está disponível.

• O dispositivo pode estar fora de alcance de uma rede, ou o usuário pode ter desativado tanto Wi-Fi e acesso a dados móvel.

• Use getActiveNetworkInfo() e isConnected()

25

Verificando a conexão de rede

26

public boolean isOnline() {

ConnectivityManager connMgr = (ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

return (networkInfo != null && networkInfo.isConnected());

}

• Lendo e convertendo em Texto

• Lendo uma imagem

27

// Reads an InputStream and converts it to a String.

public String readIt(InputStream stream, int len)

throws IOException, UnsupportedEncodingException {

Reader reader = null;

reader = new InputStreamReader(stream, "UTF-8");

char[] buffer = new char[len];

reader.read(buffer);

return new String(buffer);

}

InputStream is = null;

...

Bitmap bitmap = BitmapFactory.decodeStream(is);

ImageView imageView = (ImageView) findViewById(R.id.image_view);

imageView.setImageBitmap(bitmap);

Não se esqueça:

<uses-permission android:name ="android.permission.INTERNET"/>

Para maiores informaçoes

http://developer.android.com/training/basics/

network-ops/managing.html

28

WebServices

• Solução usada na integração de sistemas e na comunicação entre aplicações diferentes.

• Torna possível que novas aplicações possam interagir com as já existentes e que sistemas desenvolvidos em plataformas diferentes sejam compatíveis.

• Componentes que permitem às aplicações enviar e receber dados em formato XML.

• Cada aplicação pode ter a sua própria "linguagem", que é traduzida para uma linguagem universal, o formato XML.

29

WebServices

• REST

• Requisição via URL (GET ou POST)

• Resposta em JSON, XML, etc.

• SOAP- Simple Object Access Protocol

• Requisição e resposta em XML

• invocação remota de um método que necessita especificar o endereço do componente, o nome do método e os argumentos para esse método. • Estes dados são formatados em XML com determinadas

regras e enviados normalmente por HTTP para esse componente. 30

SOAP (Simple Object Access Protocol)

• Invocação remota de um método necessitando

• endereço do componente,

• o nome do método e

• os argumentos para esse método.

• Dados formatados em XML e enviados por HTTP.

• Não define ou impõe qualquer semântica o que o serviço ou o cliente sejam aplicações desenvolvidas por diferentes linguagens.

31

SOAP (Simple Object Access Protocol)

• WSDL descreve os serviços disponibilizados à rede através de XML, que providencia a documentação necessária para se chamar um sistema distribuído e o procedimento para que esta comunicação se estabeleça.

• SOAP especifica a comunicação entre um cliente e um servidor, o WSDL descreve os serviços oferecidos..

32

REST (Transferência de Estado Representativo)

• Técnica de engenharia de software para sistemas distribuídos desenvolvida pelo Roy Fielding.

• Pretendida como uma imagem do design da aplicação se comportará:

• uma rede de websites (um estado virtual),

• onde o usuário progride com uma aplicação selecionando as ligações (transição de estado),

• resultando na página seguinte (que representa o estado seguinte da aplicação) que está sendo transferida ao usuário e apresentada para seu uso.

• Sistemas que seguem os princípios REST são conhecidos como RESTful.

• Foco na URL e nos recursos. 33

REST

• O principal em um Web Service RESTful são as URLs e os recursos.

• Recurso ou entidade, ou seja, um objeto com informação que será representado por meio de um XML.

• a URL para acessar esse recurso será sempre a mesma, porém caso mudemos o método HTTP (GET, POST, PUT e DELETE) o resultado da requisição será diferente.

34

Implementando um simples REST Client no Android

35

Implementando um simples REST Client no Android

36

Implementando um simples REST Client no Android

37

Mais Informações

Utilizando Web Services no Google Android

• http://www.cesar.org.br/site/files/file/

WM23_Android_WebServices.pdf

Como consumir um Web Service pelo Android

• http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=17465

38

top related