كيفية تحميل الصور من الانترنت وحفظها في الاستديو للاندرويد برمجياً

بسم الله الرحمن الرحيم

في هذا اليوم إن شاء الله سوف نتعلم كيفية تنزيل الصور من الانترنت وحفظها في الأستوديو . فكرة التطبيق أننا نقوم بوضع رابط الصورة في خانة الـ editText بعدها نقوم بالضغط على زر التحميل ليتم تنزيل الصورة وعرضها في التطبيق وفي نفس الوقت يتم حفظها في الأستوديو.

في البداية نقوم بإنشاء مشروع جديد وفي ملف اللياوت الرئيسية main_activity.xml ونقوم بإضافة 3 عناصر :

  • EditText
  • Button
  • ImageView

ليصبح لديك النتيجة التالية :

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_dark">
    <Button
        android:id="@+id/button"
        android:layout_width="157dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:text="Download Image" />
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="390dp"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/button"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp" />
    <EditText
        android:id="@+id/editText"
        android:layout_width="377dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:inputType="textPersonName" />
</RelativeLayout>

بعدها نذهب الى مجلد gradle.build لإضافة مكتبة الـ apache والتي سنحتاجها في فتح اتصال بالخوادم الخاصة بالصورة

apply plugin: 'com.android.application'

android {
    useLibrary 'org.apache.http.legacy'
  -------
}

من ثم نقوم بالذهاب الى ملف الجافا الرئيسية الـ MainActivity.java و نقوم بإضافة الكلاس التالي :

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
 @Override
 protected Bitmap doInBackground(String... urls) {
 try {
 URL url = new URL(urls[0]);
 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 connection.connect();
سيقوم بتحميل البيانات على شكل stream input //
 InputStream inputStream = connection.getInputStream();
نقوم بتحويل البيانات الى bitmap //
 Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);
 return myBitmap;
 } catch (MalformedURLException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 return null;
 }
}

وضعنا  catch/try في الكود, احتمال لا يوجد اتصال في الانترنت, نضعها تجنب حدوث خطأ.

وفي زر التحميل نقوم بإضافة هذا الكود الذي يقوم بأخذ الرابط من الـ edittext وإرسالها الى كلاس ImageDownloader ومن ثم عرض البيانات القادمة من
الكلاس في ال ImageView:

ImageDownloader task = new ImageDownloader();
Bitmap myImage;
try {
 String getUrl= URl.getText().toString();
نمرر لكالس الImageDownloaderرابط الصوره التي نريد تحميلها //
 myImage = task.execute(getUrl).get();
 downloadedImg.setImageBitmap(myImage);
 BitmapDrawable draw = (BitmapDrawable) downloadedImg.getDrawable();
 Bitmap bitmap = draw.getBitmap();
} catch (Exception e) {
 e.printStackTrace();
}

بعدها نضيف كود حفظ البيانات في الاستوديو :

الى هنا ستظهر الصوره في التطبيق وأالن يجب علينا حفظها في االستوديو//
FileOutputStream outStream = null;
File sdCard = Environment.getExternalStorageDirectory();
نضع المسار الذي سنحفظ الصوره فيه في حالتي سأختار مسار ال DCIM//
ولكن يفضل ان تنشئ مجلد خاص بتطبيقك في حال اردت تطوير التطبيق وجعله يخزن اكثر من صوره//
File dir = new File(sdCard.getAbsolutePath() + "/DCIM");
dir.mkdirs();
String fileName = String.format("%d.jpg", System.currentTimeMillis());
File outFile = new File(dir, fileName);
outStream = new FileOutputStream(outFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();

في النهاية يجب ان يكود الكود بشكله النهائي هكذا :

MainActivity.java

import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
 ImageView downloadedImg;
 EditText URl;
 Button download;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 downloadedImg = (ImageView) findViewById(R.id.imageView);
 download = (Button) findViewById(R.id.button);
 URl = (EditText) findViewById(R.id.editText);
 download.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
هذه روابط لصورتين في حال اردت تجربة التحميل//
// https://upload.wikimedia.org/wikipedia/en/a/aa/Bart_Simpson_200px.png

//https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png
 ImageDownloader task = new ImageDownloader();
 Bitmap myImage;
 try {
 String getUrl= URl.getText().toString();
نمرر لكالس الImageDownloaderرابط الصوره التي نريد تحميلها //
 myImage = task.execute(getUrl).get();
 downloadedImg.setImageBitmap(myImage);
 BitmapDrawable draw = (BitmapDrawable) downloadedImg.getDrawable();
Bitmap bitmap = draw.getBitmap();
الى هنا ستظهر الصوره في التطبيق وأالن يجب علينا حفظها في االستوديو//
 FileOutputStream outStream = null;
 File sdCard = Environment.getExternalStorageDirectory();
نضع المسار الذي سنحفظ الصوره فيه في حالتي سأختار مسار ال DCIM //
ولكن يفضل ان تنشئ مجلد خاص بتطبيقك في حال اردت تطوير التطبيق وجعله يخزن اكثر من صوره//
 File dir = new File(sdCard.getAbsolutePath() + "/DCIM");
 dir.mkdirs();
String fileName = String.format("%d.jpg", System.currentTimeMillis());
 File outFile = new File(dir, fileName);
outStream = new FileOutputStream(outFile);
 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
 outStream.flush();
outStream.close();
 } catch (Exception e) {
 e.printStackTrace();
 }
 Log.i("Interaction", "Button Tapped");
 }
 });
 }
 @TargetApi(Build.VERSION_CODES.CUPCAKE)
 public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
 @Override
 protected Bitmap doInBackground(String... urls) {
 try {
 URL url = new URL(urls[0]);
 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 connection.connect();
سيقوم بتحميل البيانات على شكل stream input //
 InputStream inputStream = connection.getInputStream();
نقوم بتحويل البيانات الى bitmap //
 Bitmap myBitmap = BitmapFactory.decodeStream(inputStream);
 return myBitmap;
 } catch (MalformedURLException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 return null;
 }
 }
}

ولا ننسى أن نضيف صلاحية في ملف الـ AndroidManifest ليسمح لنا باستخدام الانترنت والكتابة في ذاكرة الهاتف :

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

والأن نقوم بتجربة التطبيق. والنتيجة :

تعلمنا في هذا الدرس:
– حفظ الصور في الاستوديو والتعامل مع الملفات .
– طريقة الاتصال بالانترنت و الذي سيساعدك مستقبلاً في حالة :
* أردت تحميل بيانات من سيرفر وعرضها في تطبيقك
* أو تطوير التطبيق وجعله يقوم بتحميل مقاطع الفيديو وعرضها بطريقة ListView

في النهاية أتمنى ان يكون الدرس سهلاً وبسيطاً و إي استفسار او مشكلة تواجهك يمكنك التواصل معي عبر التعليقات.

* هذه المقال تم مشاركتها من أصدقاء مجموعة اندرودي عربي.
الكاتب : علي الشمري

Check Also

مواقع سورسات وأكواد مفتوحة المصدر للاندرويد

بسم الله الرحمن الرحيم الكثير من مبرمجي الاندرويد يبحثون عن خصائص أو مميزات ليضيفوها في …

شرح بسيط عن الـRecyclerView بالاندرويد

بسم الله الرحمن الرحيم الكثير منا يواجه احياناً عندما يريد أن يقوم بتنظيم مجموعة من البيانات …

هل لغتك المفضلة للبرمجة هي سر نجاح تطبيقاتك الذكية ؟

بسم الله الرحمن الرحيم منذ ظهور الاجهزة المحمولة وتطبيقات الجوال تزداد بشكلٍ كبيرٍ جداً سواءً …

ضع بصمتك بتعليق يعبر عن امتنانك

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.