J'utilise actuellement le morceau de code suivant pour charger des images lorsque des objets dessinables forment une URL.
Drawable drawable_from_url(String url, String src_name)
throws Java.net.MalformedURLException, Java.io.IOException {
return Drawable.createFromStream(((Java.io.InputStream)new Java.net.URL(url).getContent()), src_name);
}
Ce code fonctionne exactement comme souhaité, mais il semble qu'il y ait des problèmes de compatibilité avec lui. Dans la version 1.5, il lance un FileNotFoundException
lorsque je lui donne une URL. En 2.2, étant donné la même URL exacte, cela fonctionne très bien. L'URL suivante est un exemple d'entrée que je donne à cette fonction.
http://bks6.books.google.com/books?id=aH7BPTrwNXUC&printsec=frontcover&img=1&zoom=5&Edge=curl&sig=ACfU3U2aQRnAX2o2ny2xFC1GmVn22almpg
Comment charger des images d'une manière compatible à tous les niveaux à partir d'une URL?
Je l'ai résolu moi-même. Je l'ai chargé en tant que bitmap en utilisant le code suivant.
Bitmap drawable_from_url(String url) throws Java.net.MalformedURLException, Java.io.IOException {
HttpURLConnection connection = (HttpURLConnection)new URL(url) .openConnection();
connection.setRequestProperty("User-agent","Mozilla/4.0");
connection.connect();
InputStream input = connection.getInputStream();
return BitmapFactory.decodeStream(input);
}
Il était également important d'ajouter l'agent utilisateur, car Googlebooks refuse l'accès s'il est absent
Bitmap n'est pas un dessinable. Si vous avez vraiment besoin d'un Drawable, procédez comme suit:
public static Drawable drawableFromUrl(String url) throws IOException {
Bitmap x;
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.connect();
InputStream input = connection.getInputStream();
x = BitmapFactory.decodeStream(input);
return new BitmapDrawable(Resources.getSystem(), x);
}
(J'ai utilisé l'astuce trouvée dans https://stackoverflow.com/a/2416360/450148 )
Je ne suis pas sûr, mais je pense que Drawable.createFromStream () est plus destiné à être utilisé avec des fichiers locaux plutôt que des InputStreams téléchargés. Essayez d'utiliser BitmapFactory.decodeStream()
, puis encapsulez le bitmap de retour dans un BitmapDrawable .
Pour obtenir une image Drawable à partir d'une URL, vous devez utiliser un AsyncTask
pour éviter NetWorkOnMainThreadException
, et le résultat Drawable obtenu dans onPostExecute()
vous pouvez définir votre ImageView:
final String urlImage = "https://www.Android.com/static/2016/img/hero-carousel/banner-Android-p-2.jpg";
new AsyncTask<String, Integer, Drawable>(){
@Override
protected Drawable doInBackground(String... strings) {
Bitmap bmp = null;
try {
HttpURLConnection connection = (HttpURLConnection) new URL(urlImage).openConnection();
connection.connect();
InputStream input = connection.getInputStream();
bmp = BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
}
return new BitmapDrawable(bmp);
}
protected void onPostExecute(Drawable result) {
//Add image to ImageView
myImageView.setImageDrawable(result);
}
}.execute();
Vous pouvez utiliser com.androidquery.AndroidQuery pour le faire tout simplement. Par exemple:
AQuery aq = new AQuery(this);
aq.id(view).image("http://yourserver/yourimage.png", true, true, 300, new BitmapAjaxCallback() {
@Override
public void callback(String url, ImageView imageView, Bitmap bitmap, AjaxStatus status) {
Drawable drawable = new BitmapDrawable(getResources(), bm);
}
});
Si vous utilisez BitmapAjaxCallback, vous aurez accès au BitMap que vous pouvez encapsuler en tant que BitmapDrawable.
Le code suivant fonctionne pour moi:
Matrix Mat = new Matrix();
Bitmap Source = BitmapFactory.decodeFile("ItemImagePath");
Bitmap Destination = Bitmap.createScaledBitmap( Source, 320, 320, true );
Source = Bitmap.createBitmap( Destination, 0, 0, Destination.getWidth(), Destination.getHeight(),Mat, true );
ItemImageView.setImageBitmap(Source);