Leitor RSS Android

9 respostas
J

Bom dia a todos…

Estou implementando um leitor de feeds de noticias, trago as noticias certinho, mais não consigo trazer as imagens(fotos).

Alguem pode me ajudar.

Aguardo retorno.

Att.
Juliana Corá.

9 Respostas

G

aqui no trabalho fizeram algo assim…

eu nao mexi e nao sei como funciona… vc tem o caminho dessas imagens? uma URL?

M

Eu tenho esse codigo aqui para baixar as imagens do servidor.

private String downloadImg(String src) {
		try {
			URL url = new URL(src);
			String fileName = url.getFile().replaceAll("/", "");
			if (!fileName.endsWith("png"))
				fileName = fileName.substring(0, fileName.lastIndexOf('.'))
						+ ".png";
			File file = new File(IMAGES_PATH + fileName);
			if (file.exists())
				return IMAGES_PATH + fileName;

			InputStream stream = url.openStream();
			Bitmap result = BitmapFactory.decodeStream(stream);
			stream.close();

			if (result == null)
				return null;

			file.createNewFile();

			FileOutputStream fos = new FileOutputStream(file);
			result.compress(CompressFormat.PNG, 10, fos);
			fos.flush();
			fos.close();

			return IMAGES_PATH + fileName;
		} catch (IOException e) {
			e.printStackTrace();
		}

		return null;
	}

E ele ainda salva o arquivo em algum local e retorna a URL do arquivo.

G

hehehehe.

Era o que eu ia propor. se você tem a url pode abrir um stream pra imagem. Porisso perguntei.

Aproveitando… Marky, você saber dizer que protocolo de rede uma conexão assim usa pra poder se conectar e sair baixando a imagem?

talvez com um sniffer de pra ver, ne? Mas você tem ideia de qual protocolo é usado?

J

Olha o que eu fiz…

no main.xml criei - uma ImageView

as classes…

Essa ultima classe seria o meu problema…de como pegar a imagem…
Caso esteja errada me corrija por favor…
Me desculpa as classes estão um pouco picadas…hehehe

E

Oii Juh,

eu tentei rodar seu projeto aqui no meu eclipse, ao que me parece esta faltando algumas coisas.
Aqui reclama da falta da Classe RSSItem, existe ela?

Passe o codigo inteiro para que eu possa testar aqui.
Abraço!

J

Pessoal, tentei…tentei mais ainda não consegui…me de uma luz por favor!!!

Tentar explicar novamente…

Estou lendo um XML de um site de noticias, trago o title certinho, o caminho da imagem (description) trago tambem, só que não consigo mostrar a imagem na
aplicação.

Abaixo segue a classe.

public class MainActivity extends Activity 
{	
private final String CGR_FEED_URL = "http://globoesporte.globo.com/dynamo/semantica/editorias/plantao/feed.rss";
	
	private ListView listview_episodes;
	private ImageView imagemView;
	
	private ArrayList<String> episode_titles;
	private ArrayList<String> episode_urlImage;
	
	Episode episode = new Episode();
	
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        
        listview_episodes = (ListView) findViewById(R.id.listview_episodes);     
        
        episode_titles = new ArrayList<String>();       
    	episode_urlImage  = new ArrayList<String>(); 
      
        downloadEpisodes(CGR_FEED_URL);        
    }
    
    private void downloadEpisodes(String Url) 
    {
    	Log.d("CGRParser", "Downloading Feed");
    	new DownloadEpisodes().execute(Url);
    }
    
    private class DownloadEpisodes extends AsyncTask<String, Integer, ArrayList<Episode>>
    {
		@Override
		protected ArrayList<Episode> doInBackground(String... url) 
		{			
			//Download and Parse Feed
			XmlFeedParser parser = new XmlFeedParser();
			ArrayList<Episode> episodes = new ArrayList<Episode>();
			episodes = parser.parse(url[0]);
			
			return episodes;
		}
		
		@Override
	    protected void onPostExecute(ArrayList<Episode> result)
		{				
			Log.d("CGRParser", "Feed Download Complete");			
			displayEpisodes(result);			
	    }
	}
    
    private void displayEpisodes(ArrayList<Episode> episodes) 
    {    	
    	Log.d("CGRParser", "Displaying Episode Titles To User");
    	ArrayList<String> episode_titles = new ArrayList<String>();
    	ArrayList<String> episode_urlImage = new ArrayList<String>();
    	
    	for (Episode episode : episodes) 
    	{
                //aqui ta certinho, esta trazendo o title e caminho da imagem.
    		Log.d("CGRParser", "Episode Titles: " + episode.getTitle()); 
                Log.d("CGRParser", "Episode Titles: " + episode.getImagemUrl());       		
    		episode_titles.add(episode.getTitle());
		episode_urlImage.add(episode.getImagemUrl());

	       //abaixo seria meu problema, esta dando erro na aplicação.....
	       URL url = new URL(episode.getImagemUrl());
               InputStream in = url.openStream();
               Bitmap bitmap = BitmapFactory.decodeStream(in);
               ImageView imgView = (ImageView) findViewById(R.id.imagem);
               Drawable d = new BitmapDrawable(bitmap);
               imgView.setImageDrawable(d);
	    }
    	
    	    this.episode_titles = episode_titles;	
	    this.episode_urlImage = episode_urlImage;
    	
            //abaixo é a hora que lista os titles na tela, mais gostaria que listasse junto as imagens vindo do xml
           ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.main, R.id.title, episode_titles);
           //ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.main, R.id.title, episode_titles,  R.id.imagem, episode_urlImage);
    	   listview_episodes.setAdapter(adapter);
    }		
}

Espero que alguem me ajude, aguardo retorno…
Abraços.

F

Qual está sendo exatamente o problema??

Não entendi se é baixar a imagem ou exibi-la. Pelo código parece que é a exibição.

Se for esse o caso, já tentou usar um ListActivity ao invés do Activity e um SimpleAdapter ao invés do ArrayAdapter?

Pode ser o caso também de esquecer dos "adapter" e montar a lista "na mão" mesmo. Não é tão complicado. Este trecho de código faz isso:

ViewGroup layout = (ViewGroup)findViewById(R.id.list);
layout.removeAllViews();
for (String[] str : msg) {
	View view = View.inflate(this, R.layout.warning_viewer_msg, null);
	((TextView)view.findViewById(R.id.msgDate)).setText(str[1]);
	((TextView)view.findViewById(R.id.msgText)).setText(str[2]);

	try {
		@SuppressWarnings("rawtypes")
		Class clazz = Class.forName(pref.getString(str[0] + ".class", "java.lang.String"));
		AbstractBaseUploader uploader = (AbstractBaseUploader)clazz.newInstance();
		((ImageView)view.findViewById(R.id.image)).setImageResource(uploader.getNotificationErrorIcon());
	} catch (ClassNotFoundException ignored) {
	} catch (Exception ignored) {
	}

	layout.addView(view);
}
O "R.id.list" é um LinearLayout. Ele monta uma lista contendo 3 colunas: a primeira é uma imagem, e as outras duas são textos.
E

Juh, eu consegui implementar em meu projeto um leitor de RSS mas eu nao precisava buscar imagens.

Lembro que este artigo me ajudou bastante, tente abstrair algo de lá: http://www.ibm.com/developerworks/br/opensource/library/x-android/

J

Bom dia Pessoal…

Meu problema foi solucionado, então vou postar caso vocês precisem ok....


Sobre a imagem tive que fazer uma função para buscar na tag <description>, primeiro o .jpg e ir voltando até o http para poder ter a url da imagem.
public void setStringUrl(String StringUrl)
	{
		int indice = StringUrl.indexOf(".jpg");
		
		if (indice > 0)
		{
			String p_texto = StringUrl.substring(0, indice);
			String URL_IMAGE = ".jpg";
		    String encontrou = "N";
		    int achouHTTP=0;
		    indice = indice -1;
		    int count = 0;
		    
		    while(encontrou == "N") 
		    {
		    	count = count + 1;
		    	achouHTTP = -1;
		    	
		    	char ind = p_texto.charAt(indice);
		    	
		    	achouHTTP = URL_IMAGE.indexOf("http");
		        if (achouHTTP >= 0)
				{
				    encontrou = "S";
				}
		        else
		        {
		        	URL_IMAGE = ind+URL_IMAGE;
		        	indice = indice -1;
		        }
		    }
		    this.StringUrl = URL_IMAGE;
		}	
	}

e baixo é onde mostro a imagem e title e data da noticia

public View getView(int position, View convertView, ViewGroup parent)
	{
		Episode episode = lista.get(position);
		
		LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		View v = inflater.inflate(R.layout.main, null);	
		
		TextView textTitle = (TextView) v.findViewById(R.id.title);
		textTitle.setText(episode.getTitle());
		
		ImageView imagemView = (ImageView) v.findViewById(R.id.icon);
		
		BitmapFactory.Options bmOptions;
		bmOptions = new BitmapFactory.Options();
		bmOptions.inSampleSize = 1;
		setBmp(LoadImage(episode.getStringUrl() ,bmOptions));
		
		imagemView.setImageBitmap(getBmp());
		
		TextView textDate = (TextView) v.findViewById(R.id.data);
		textDate.setText(episode.getDate());	
		   
		return v;
	}

Espero que tenham entendido…

Abraço.

Criado 27 de abril de 2011
Ultima resposta 19 de mai. de 2011
Respostas 9
Participantes 5