Android - leitor RSS
RSS significa Really Simple Syndication. RSS é uma maneira fácil de compartilhar as atualizações e o conteúdo do seu site com seus usuários, para que eles não tenham que visitar seu site diariamente para qualquer tipo de atualização.
Exemplo RSS
RSS é um documento criado pelo site com extensão .xml. Você pode facilmente analisar este documento e mostrá-lo ao usuário em seu aplicativo. Um documento RSS se parece com isso.
<rss version="2.0">
<channel>
<title>Sample RSS</title>
<link>http://www.google.com</link>
<description>World's best search engine</description>
</channel>
</rss>
Elementos RSS
Um documento RSS como o acima possui os seguintes elementos.
Sr. Não | Descrição do componente |
---|---|
1 | channel Este elemento é usado para descrever o feed RSS |
2 | title Define o título do canal |
3 | link Define o hiperlink para o canal |
4 | description Descreve o canal |
Analisando RSS
Analisar um documento RSS é mais parecido com analisar XML. Portanto, agora vamos ver como analisar um documento XML.
Para isso, vamos criar o objeto XMLPullParser, mas para criá-lo vamos primeiro criar o objeto XmlPullParserFactory e depois chamar seu método newPullParser () para criar XMLPullParser. Sua sintaxe é fornecida abaixo -
private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();
A próxima etapa envolve a especificação do arquivo para XmlPullParser que contém XML. Pode ser um arquivo ou um Stream. No nosso caso, é um fluxo. Sua sintaxe é fornecida abaixo -
myparser.setInput(stream, null);
A última etapa é analisar o XML. Um arquivo XML consiste em eventos, Nome, Texto, AttributesValue etc. Portanto, XMLPullParser tem uma função separada para analisar cada um dos componentes do arquivo XML. Sua sintaxe é fornecida abaixo -
int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
if(name.equals("temperature")){
temperature = myParser.getAttributeValue(null,"value");
}
break;
}
event = myParser.next();
}
O método getEventTyperetorna o tipo de evento que acontece. por exemplo: início do documento, início da tag, etc. O métodogetName retorna o nome da tag e uma vez que estamos interessados apenas na temperatura, então apenas verificamos na declaração condicional que se obtivermos uma tag de temperatura, chamamos o método getAttributeValue para nos retornar o valor da etiqueta de temperatura.
Além desses métodos, existem outros métodos fornecidos por esta classe para analisar melhor os arquivos XML. Esses métodos estão listados abaixo -
Sr. Não | Método e descrição |
---|---|
1 | getAttributeCount() Este método retorna apenas o número de atributos da tag de início atual. |
2 | getAttributeName(int index) Este método retorna o nome do atributo especificado pelo valor do índice. |
3 | getColumnNumber() Este método retorna o Retorna o número da coluna atual, começando em 0. |
4 | getDepth() Este método retorna Retorna a profundidade atual do elemento. |
5 | getLineNumber() Retorna o número da linha atual, começando em 1. |
6 | getNamespace() Este método retorna o URI do espaço de nomes do elemento atual. |
7 | getPrefix() Este método retorna o prefixo do elemento atual. |
8 | getName() Este método retorna o nome da tag. |
9 | getText() Este método retorna o texto para aquele elemento específico. |
10 | isWhitespace() Este método verifica se o evento TEXT atual contém apenas caracteres de espaço em branco. |
Exemplo
Aqui está um exemplo que demonstra o uso da classe XMLPullParser. Ele cria um aplicativo de análise básica que permite analisar um documento RSS presente aqui em /android/sampleXML.xml e, em seguida, mostrar o resultado.
Para experimentar este exemplo, você pode executá-lo em um dispositivo real ou em um emulador.
Passos | Descrição |
---|---|
1 | Você usará o Android Studio para criar um aplicativo Android em um pacote com.example.sairamkrishna.myapplication. |
2 | Modifique o arquivo src / MainActivity.java para adicionar o código necessário. |
3 | Modifique res / layout / activity_main para adicionar os respectivos componentes XML. |
4 | Crie um novo arquivo java em src / HandleXML.java para buscar e analisar dados XML. |
5 | Crie um novo arquivo java em src / second.java para exibir o resultado do XML |
5 | Modifique AndroidManifest.xml para adicionar a permissão de Internet necessária. |
6 | Execute o aplicativo e escolha um dispositivo Android em execução, instale o aplicativo nele e verifique os resultados. |
A seguir está o conteúdo do arquivo de atividade principal modificado src/MainActivity.java.
package com.example.sairamkrishna.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText title,link,description;
Button b1,b2;
private String finalUrl="http://tutorialspoint.com/android/sampleXML.xml";
private HandleXML obj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
title = (EditText) findViewById(R.id.editText);
link = (EditText) findViewById(R.id.editText2);
description = (EditText) findViewById(R.id.editText3);
b1=(Button)findViewById(R.id.button);
b2=(Button)findViewById(R.id.button2);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
obj = new HandleXML(finalUrl);
obj.fetchXML();
while(obj.parsingComplete);
title.setText(obj.getTitle());
link.setText(obj.getLink());
description.setText(obj.getDescription());
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent in=new Intent(MainActivity.this,second.class);
startActivity(in);
}
});
}
}
A seguir está o conteúdo do arquivo java src/HandleXML.java.
package com.example.rssreader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import android.util.Log;
public class HandleXML {
private String title = "title";
private String link = "link";
private String description = "description";
private String urlString = null;
private XmlPullParserFactory xmlFactoryObject;
public volatile boolean parsingComplete = true;
public HandleXML(String url){
this.urlString = url;
}
public String getTitle(){
return title;
}
public String getLink(){
return link;
}
public String getDescription(){
return description;
}
public void parseXMLAndStoreIt(XmlPullParser myParser) {
int event;
String text=null;
try {
event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.TEXT:
text = myParser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equals("title")){
title = text;
}
else if(name.equals("link")){
link = text;
}
else if(name.equals("description")){
description = text;
}
else{
}
break;
}
event = myParser.next();
}
parsingComplete = false;
}
catch (Exception e) {
e.printStackTrace();
}
}
public void fetchXML(){
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
InputStream stream = conn.getInputStream();
xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myparser = xmlFactoryObject.newPullParser();
myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myparser.setInput(stream, null);
parseXMLAndStoreIt(myparser);
stream.close();
}
catch (Exception e) {
}
}
});
thread.start();
}
}
Crie um arquivo com o nome de arquivo second.java no diretório java/second.java
package com.example.sairamkrishna.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
public class second extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_activity);
WebView w1=(WebView)findViewById(R.id.webView);
w1.loadUrl("http://tutorialspoint.com/android/sampleXML.xml");
}
}
Crie um arquivo xml em res/layout/second_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/webView"
android:layout_gravity="center_horizontal" />
</LinearLayout>
Modifique o conteúdo de res/layout/activity_main.xml para o seguinte -
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:transitionGroup="true">
<TextView android:text="RSS example" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textview"
android:textSize="35dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point"
android:id="@+id/textView"
android:layout_below="@+id/textview"
android:layout_centerHorizontal="true"
android:textColor="#ff7aff24"
android:textSize="35dp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/abc"
android:layout_below="@+id/textView"
android:layout_centerHorizontal="true"
android:theme="@style/Base.TextAppearance.AppCompat" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageView"
android:hint="Tittle"
android:textColorHint="#ff69ff0e"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText"
android:layout_alignStart="@+id/editText"
android:textColorHint="#ff21ff11"
android:hint="Link"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText3"
android:layout_below="@+id/editText2"
android:layout_alignLeft="@+id/editText2"
android:layout_alignStart="@+id/editText2"
android:hint="Description"
android:textColorHint="#ff33ff20"
android:layout_alignRight="@+id/editText2"
android:layout_alignEnd="@+id/editText2" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetch"
android:id="@+id/button"
android:layout_below="@+id/editText3"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/imageView"
android:layout_toStartOf="@+id/imageView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Result"
android:id="@+id/button2"
android:layout_alignTop="@+id/button"
android:layout_alignRight="@+id/editText3"
android:layout_alignEnd="@+id/editText3" />
</RelativeLayout>
Modifique o res/values/string.xml para o seguinte
<resources>
<string name="app_name">My Application</string>
</resources>
Este é o padrão AndroidManifest.xml.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sairamkrishna.myapplication" >
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".second"></activity>
</application>
</manifest>
Vamos tentar executar seu aplicativo. Suponho que você tenha criado o seuAVDao fazer a configuração do ambiente. Para executar o aplicativo do Android Studio, abra um dos arquivos de atividade do seu projeto e clique no ícone Executar na barra de ferramentas. O Android Studio instala o aplicativo em seu AVD e o inicia e se tudo estiver bem com sua configuração e aplicativo, ele será exibido a seguir a janela do emulador -
Basta pressionar o botão Buscar feed para buscar feed RSS. Após pressionar, aparecerá a tela a seguir, que mostrará os dados RSS.
Basta pressionar o botão de resultado para ver o XML, que é colocado em http://tutorialspoint.com/android/sampleXML.xml