web-dev-qa-db-fra.com

Android Images dessinables à partir de l'URL

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?

28

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

15

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 )

46
Felipe

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 .

5
Daniel Lew

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();
1
Jorgesys

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.

1
Adriaan Koster

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);
1
Dhukkaieswaran.N