Como você usa uma imagem referenciada pelo URL em um ImageView
?
Como você usa uma imagem referenciada pelo URL em um ImageView
?
Respostas:
// show The Image in a ImageView
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
public void onClick(View v) {
startActivity(new Intent(this, IndexActivity.class));
finish();
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
Verifique se você possui as seguintes permissões definidas AndroidManifest.xml
para acessar a Internet.
<uses-permission android:name="android.permission.INTERNET" />
1. O Picasso permite o carregamento de imagens sem problemas no seu aplicativo - geralmente em uma linha de código!
Use Gradle:
implementation 'com.squareup.picasso:picasso:2.71828'
Apenas uma linha de código!
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);
2. Planar Uma biblioteca de carregamento e armazenamento de imagens para Android focada em rolagem suave
Use Gradle:
repositories {
mavenCentral()
google()
}
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
}
// Para uma visão simples:
Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
3. fresco é um sistema poderoso para a exibição de imagens em aplicativos Android . O Fresco cuida do carregamento e exibição da imagem, para que você não precise.
Você terá que baixar a imagem primeiro
public static Bitmap loadBitmap(String url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new URL(url).openStream(), IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 1;
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
} catch (IOException e) {
Log.e(TAG, "Could not load Bitmap from: " + url);
} finally {
closeStream(in);
closeStream(out);
}
return bitmap;
}
Em seguida, use o Imageview.setImageBitmap para definir o bitmap no ImageView
Eu escrevi uma classe para lidar com isso, pois parece ser uma necessidade recorrente em meus vários projetos:
https://github.com/koush/UrlImageViewHelper
UrlImageViewHelper preencherá um ImageView com uma imagem encontrada em um URL.
A amostra fará uma Pesquisa de imagens do Google e carregará / exibirá os resultados de forma assíncrona.
O UrlImageViewHelper fará o download, salvará e armazenará em cache automaticamente todos os URLs da imagem do BitmapDrawables. Os URLs duplicados não serão carregados na memória duas vezes. A memória de bitmap é gerenciada usando uma tabela de hash de referência fraca; assim que a imagem não for mais usada por você, ela será coletada automaticamente.
Enfim, as pessoas pedem meu comentário para publicá-lo como resposta. estou postando.
URL newurl = new URL(photo_url_str);
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream());
profile_photo.setImageBitmap(mIcon_val);
A resposta aceita acima é ótima se você estiver carregando a imagem com base em um clique no botão; no entanto, se estiver fazendo isso em uma nova atividade, ela congelará a interface do usuário por um segundo ou dois. Olhando em volta, descobri que uma simples assíncrona eliminava esse problema.
Para usar um asynctask, adicione esta classe no final de sua atividade:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
public DownloadImageTask(ImageView bmImage) {
this.bmImage = bmImage;
}
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return mIcon11;
}
protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}
}
E chame a partir do seu método onCreate () usando:
new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
.execute(MY_URL_STRING);
O resultado é uma atividade carregada rapidamente e uma visualização de imagem que aparece uma fração de segundo depois, dependendo da velocidade da rede do usuário.
Você também pode usar esta exibição LoadingImageView para carregar uma imagem de um URL:
http://blog.blundellapps.com/imageview-with-loading-spinner/
Depois de adicionar o arquivo de classe a partir desse link, você pode instanciar uma visualização de imagem de URL:
em xml:
<com.blundell.tut.LoaderImageView
android:id="@+id/loaderImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
image="http://developer.android.com/images/dialog_buttons.png"
/>
Em código:
final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");
E atualize-o usando:
image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");
public class LoadWebImg extends Activity {
String image_URL=
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView bmImage = (ImageView)findViewById(R.id.image);
BitmapFactory.Options bmOptions;
bmOptions = new BitmapFactory.Options();
bmOptions.inSampleSize = 1;
Bitmap bm = LoadImage(image_URL, bmOptions);
bmImage.setImageBitmap(bm);
}
private Bitmap LoadImage(String URL, BitmapFactory.Options options)
{
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
bitmap = BitmapFactory.decodeStream(in, null, options);
in.close();
} catch (IOException e1) {
}
return bitmap;
}
private InputStream OpenHttpConnection(String strURL) throws IOException{
InputStream inputStream = null;
URL url = new URL(strURL);
URLConnection conn = url.openConnection();
try{
HttpURLConnection httpConn = (HttpURLConnection)conn;
httpConn.setRequestMethod("GET");
httpConn.connect();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
inputStream = httpConn.getInputStream();
}
}
catch (Exception ex)
{
}
return inputStream;
}
}
Oi, eu tenho o código mais fácil, tente isso
public class ImageFromUrlExample extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView imgView =(ImageView)findViewById(R.id.ImageView01);
Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png");
imgView.setImageDrawable(drawable);
}
private Drawable LoadImageFromWebOperations(String url)
{
try{
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src name");
return d;
}catch (Exception e) {
System.out.println("Exc="+e);
return null;
}
}
}
main.xml
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/ImageView01"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
tente isso
A melhor biblioteca moderna para essa tarefa, na minha opinião, é Picasso by Square. Permite carregar uma imagem em um ImageView por URL com uma linha:
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Eu encontrei recentemente um tópico aqui , pois tenho que fazer algo semelhante para uma lista de exibição com imagens, mas o princípio é simples, como você pode ler na primeira classe de exemplo mostrada lá (por jleedev). Você obtém o fluxo de entrada da imagem (da web)
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
Em seguida, você armazena a imagem como Drawable e pode transmiti-la ao ImageView (via setImageDrawable). Novamente, no snippet de código superior, dê uma olhada em todo o thread.
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
Muitas informações boas aqui ... Encontrei recentemente uma classe chamada SmartImageView que parece estar funcionando muito bem até agora. Muito fácil de incorporar e usar.
http://loopj.com/android-smart-image-view/
https://github.com/loopj/android-smart-image-view
ATUALIZAÇÃO : Acabei escrevendo uma postagem de blog sobre isso , então confira para obter ajuda sobre o uso do SmartImageView.
2ª ATUALIZAÇÃO : Agora sempre uso o Picasso para isso (veja acima) e recomendo. :)
Esta é uma resposta tardia, conforme sugerido acima AsyncTask
e, depois de pesquisar um pouco, encontrei mais uma maneira para esse problema.
Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
imageView.setImageDrawable(drawable);
Aqui está a função completa:
public void loadMapPreview () {
//start a background thread for networking
new Thread(new Runnable() {
public void run(){
try {
//download the drawable
final Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");
//edit the view in the UI thread
imageView.post(new Runnable() {
public void run() {
imageView.setImageDrawable(drawable);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
Não se esqueça de adicionar as seguintes permissões no seu AndroidManifest.xml
para acessar a Internet.
<uses-permission android:name="android.permission.INTERNET" />
Eu tentei isso sozinho e ainda não enfrentei nenhum problema.
Thread
porque o encadeamento da interface do usuário não permite operações de rede.
Isso irá ajudá-lo ...
Definir visualização de imagem e carregar imagem nela .....
Imageview i = (ImageView) vv.findViewById(R.id.img_country);
i.setImageBitmap(DownloadFullFromUrl(url));
Em seguida, defina este método:
public Bitmap DownloadFullFromUrl(String imageFullURL) {
Bitmap bm = null;
try {
URL url = new URL(imageFullURL);
URLConnection ucon = url.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
bm = BitmapFactory.decodeByteArray(baf.toByteArray(), 0,
baf.toByteArray().length);
} catch (IOException e) {
Log.d("ImageManager", "Error: " + e);
}
return bm;
}
String img_url= //url of the image
URL url=new URL(img_url);
Bitmap bmp;
bmp=BitmapFactory.decodeStream(url.openConnection().getInputStream());
ImageView iv=(ImageView)findviewById(R.id.imageview);
iv.setImageBitmap(bmp);
Versão com manipulação de exceção e tarefa assíncrona:
AsyncTask<URL, Void, Boolean> asyncTask = new AsyncTask<URL, Void, Boolean>() {
public Bitmap mIcon_val;
public IOException error;
@Override
protected Boolean doInBackground(URL... params) {
try {
mIcon_val = BitmapFactory.decodeStream(params[0].openConnection().getInputStream());
} catch (IOException e) {
this.error = e;
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
if (success) {
image.setImageBitmap(mIcon_val);
} else {
image.setImageBitmap(defaultImage);
}
}
};
try {
URL url = new URL(url);
asyncTask.execute(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
private Bitmap getImageBitmap(String url) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
Log.e(TAG, "Error getting bitmap", e);
}
return bm;
}
Uma maneira simples e limpa de fazer isso é usar a biblioteca de código aberto Prime .
Trabalhando para o imageView em qualquer contêiner, como exibição em grade de listview, layout normal
private class LoadImagefromUrl extends AsyncTask< Object, Void, Bitmap > {
ImageView ivPreview = null;
@Override
protected Bitmap doInBackground( Object... params ) {
this.ivPreview = (ImageView) params[0];
String url = (String) params[1];
System.out.println(url);
return loadBitmap( url );
}
@Override
protected void onPostExecute( Bitmap result ) {
super.onPostExecute( result );
ivPreview.setImageBitmap( result );
}
}
public Bitmap loadBitmap( String url ) {
URL newurl = null;
Bitmap bitmap = null;
try {
newurl = new URL( url );
bitmap = BitmapFactory.decodeStream( newurl.openConnection( ).getInputStream( ) );
} catch ( MalformedURLException e ) {
e.printStackTrace( );
} catch ( IOException e ) {
e.printStackTrace( );
}
return bitmap;
}
/** Usage **/
new LoadImagefromUrl( ).execute( imageView, url );
Tente dessa maneira, espero que isso ajude você a resolver seu problema.
Aqui, explico como usar a biblioteca externa "AndroidQuery" para carregar a imagem do URL / servidor da maneira asyncTask, com também a imagem carregada em cache no arquivo do dispositivo ou na área de cache.
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageFromUrl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>
<ProgressBar
android:id="@+id/pbrLoadImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</FrameLayout>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
private AQuery aQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
aQuery = new AQuery(this);
aQuery.id(R.id.imageFromUrl).progress(R.id.pbrLoadImage).image("http://itechthereforeiam.com/wp-content/uploads/2013/11/android-gone-packing.jpg",true,true);
}
}
Note : Here I just implemented common method to load image from url/server but you can use various types of method which can be provided by "AndroidQuery"to load your image easily.
O Android Query pode lidar com isso para você e muito mais (como cache e progresso do carregamento).
Dê uma olhada aqui .
Eu acho que é a melhor abordagem.