android - المتكلم - برنامج روبوت




كيفية تحميل ImageView بواسطة URL في الروبوت؟ (16)

أفضل مكتبة حديثة لمثل هذه المهمة لرأيي هي Picasso by Square. يسمح بتحميل صورة إلى ImageView بواسطة عنوان URL بخط واحد:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

كيف تستخدم صورة مشار إليها بواسطة عنوان URL في ImageView ؟


الإصدار مع معالجة الاستثناء والمهمة المتزامنة:

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();
}

تعتبر الإجابة المقبولة أعلاه رائعة إذا كنت تقوم بتحميل الصورة استنادًا إلى نقرة زر ، ومع ذلك إذا كنت تقوم بذلك في نشاط جديد ، فإنها تقوم بتجميد واجهة المستخدم لمدة ثانية أو اثنتين. أبحث في جميع أنحاء وجدت أن ainyncask بسيط القضاء على هذه المشكلة.

لاستخدام سمة غير صحيحة ، أضف هذه الفئة في نهاية نشاطك:

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);
    }    
}

واتصل من طريقة onCreate () الخاصة بك باستخدام:

new DownloadImageTask((ImageView) findViewById(R.id.imageView1))
        .execute(MY_URL_STRING);

والنتيجة هي نشاط تم تحميله بسرعة وعرض للصورة يظهر بعد ذلك بجزء من الثانية اعتمادًا على سرعة شبكة المستخدم.


سيكون عليك تنزيل الصورة أولاً

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;
}

ثم استخدم Imageview.setImageBitmap لتعيين الصورة النقطية في ImageView


على أي حال يسأل الناس تعليقي لنشرها كإجابة. أنا نشر.

URL newurl = new URL(photo_url_str); 
mIcon_val = BitmapFactory.decodeStream(newurl.openConnection() .getInputStream());
profile_photo.setImageBitmap(mIcon_val);

شكر.


لقد كتبت فصلًا للتعامل مع هذا ، حيث يبدو أن هناك حاجة متكررة في مشروعاتي المختلفة:

https://github.com/koush/UrlImageViewHelper

سيقوم UrlImageViewHelper بتعبئة ImageView مع صورة موجودة في عنوان URL.

ستقوم العينة بإجراء بحث صور Google وتحميل / إظهار النتائج بشكل غير متزامن.

سيقوم UrlImageViewHelper تلقائيا بتحميل ، وحفظ ، وتخزين كل عناوين url للصورة BitmapDrawables. لن يتم تحميل عناوين url المكررة في الذاكرة مرتين. تتم إدارة ذاكرة الصورة النقطية باستخدام جدول تجزئة مرجعي ضعيف ، وبمجرد عدم استخدام الصورة من قِبلك ، فسيتم جمع البيانات المهملة تلقائيًا.


مرحبا لدي أسهل رمز حاول هذا

    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"/>

جرب هذا


من مطور Android :

// 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);
    }
}

تأكد من حصولك على الأذونات التالية التي تم تعيينها في AndroidManifest.xml للوصول إلى الإنترنت.

<uses-permission android:name="android.permission.INTERNET" />

هذا هو الرد في وقت متأخر ، على النحو الوارد أعلاه سوف AsyncTask سوف وبعد googling قليلا وجدت طريقة أخرى لهذه المشكلة.

Drawable drawable = Drawable.createFromStream((InputStream) new URL("url").getContent(), "src");

imageView.setImageDrawable(drawable);

هنا هي الوظيفة الكاملة:

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();
}

لا تنس إضافة الأذونات التالية في AndroidManifest.xml للوصول إلى الإنترنت.

<uses-permission android:name="android.permission.INTERNET" />

لقد حاولت هذا بنفسي ولم أواجه أي مشكلة حتى الآن.


يتم اختبار هذا الرمز ، فهو يعمل بشكل كامل.

URL req = new URL(
"http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png"
);
Bitmap mIcon_val = BitmapFactory.decodeStream(req.openConnection()
                  .getInputStream());

يمكنك أيضًا استخدام طريقة العرض LoadImageView هذه لتحميل صورة من عنوان url:

http://blog.blundellapps.com/imageview-with-loading-spinner/

بمجرد إضافة ملف الفصل من هذا الرابط ، يمكنك إنشاء عرض لصورة url:

في 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"
 />

في الكود:

final LoaderImageView image = new LoaderImageView(this, "http://developer.android.com/images/dialog_buttons.png");

وتحديثه باستخدام:

image.setImageDrawable("http://java.sogeti.nl/JavaBlog/wp-content/uploads/2009/04/android_icon_256.png");

1. يسمح Picasso بتحميل صور خالية من المتاعب في تطبيقك - غالبًا في سطر واحد من الكود!

استخدم Gradle:

implementation 'com.squareup.picasso:picasso:2.71828'

مجرد سطر واحد من التعليمات البرمجية!

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

تتم معالجة العديد من المخاطر الشائعة لتحميل الصور على Android تلقائيًا بواسطة Picasso

  • التعامل مع إعادة تدوير ImageView وتنزيل إلغاء في محول.
  • تحويلات الصور المعقدة بأقل استخدام للذاكرة.
  • الذاكرة التلقائية والتخزين المؤقت للقرص.

2. Glide مكتبة لتحميل الصور والتخزين المؤقت لنظام Android تركز على التمرير السلس

استخدم Gradle:

repositories {
  mavenCentral() // jcenter() works as well because it pulls from Maven Central
}

dependencies {
  compile 'com.github.bumptech.glide:glide:3.7.0'
  compile 'com.android.support:support-v4:19.1.0'
}

// للحصول على رأي بسيط:

@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

  Glide.with(this).load("http://i.imgur.com/DvpvklR.png").into(imageView);
}

// للحصول على قائمة صور بسيطة:

 @Override public View getView(int position, View recycled, ViewGroup container) {
      final ImageView myImageView;
      if (recycled == null) {
        myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
      } else {
        myImageView = (ImageView) recycled;
      }

      String url = myUrls.get(position);

      Glide
        .with(myFragment)
        .load(url)
        .centerCrop()
        .placeholder(R.drawable.loading_spinner)
        .crossFade()
        .into(myImageView);

      return myImageView;
}

جرب هذه الطريقة ، آمل أن يساعدك هذا في حل مشكلتك.

هنا أشرح حول كيفية استخدام مكتبة "AndroidQuery" الخارجية لتحميل الصورة من عنوان url / server بطريقة asyncTask مع تخزين ذاكرة التخزين المؤقت أيضًا إلى ملف الجهاز أو منطقة التخزين المؤقت.

  • يمكنك تنزيل مكتبة "AndroidQuery" من هنا
  • انسخ / الصق هذه الجرة إلى مجلد lib المشروع وأضف هذه المكتبة إلى مسار بناء المشروع
  • الآن أقوم بعرض العرض التوضيحي لكيفية استخدامه.

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.

    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);

imageView.setImageBitmap(BitmapFactory.decodeStream(imageUrl.openStream()));//try/catch IOException and MalformedURLException outside

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;
}
}




imageview