آموزش دانلود فایل بدون کتاب خانه در اندروید

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش دانلود فایل بدون کتاب خانه در اندروید می پردازیم با این آموزش می توانید یک Download Manager برای خودتان ایجاد کنید کلاس Download Manager از api 9 به اندروید اضافه شد این کلاس برای انجام دانلود های طولانی در background مورد استفاده قرار می گیرد از در ادامه به ویژگی های فوق العاده آن خواهیم پرداخت با ما همراه باشید.
پیشنهاد می کنم در صورتی از این آموزش استفاده کنید که نمی خواهید از هیچ کتاب خانه استفاده کنید چون دانلود فایل با کتاب خانه های volley و Retrofit از بهترین روش برای دانلود فایل در اندروید است که آموزشش در سایت موجود هست.
ویژگی دانلود منیجر ما :

  • دانلود عکس و آهنگ از هر آدرس (امکان دانلود دیگر نوع فایل هم وجود دارد) باید extension را تغییر دهید.
  • نمایش میزان پیشرفت دانلود در هر ثانیه.
  • امکان ذخیره آنها در مسیر های مختلف.
  • زمانی که دانلود به پایان برسد یک Notification ارسال می شود.
  • امکان Cancel کردن دانلود نیز وجود دارد.

در ابتدای کار وارد فایل AndroidManifest.xml شده و دتسرسی های زیر را اضافه کنید.

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

بعد از اینکار وارد layout شده در اینجا نام آن برابر با activity_main.xml است و کدهای زیر را در آن قرار دهید.

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/DownloadMusic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Download Music :D"/>
<Button
android:id="@+id/DownloadImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Image Download"/>
<Button
android:id="@+id/DownloadStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Check Status of Downloads"/>
<Button
android:id="@+id/CancelDownload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Cancel All Downloads"/>
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/DownloadData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
</ScrollView>
</LinearLayout>

در بالا سه دکمه برای برای دانلود و قطع کردن دانلود یک TextView برای نمایش داده های دانلود شده قرار گرفته است .
و کد مربوط به MainActivity.java همانند زیر می شود.

package ir.programchi;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private DownloadManager downloadManager;
    private long Image_DownloadId, Music_DownloadId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);
        Button DownloadImage = (Button) findViewById(R.id.DownloadImage);
        DownloadImage.setOnClickListener(this);
        Button DownloadMusic = (Button) findViewById(R.id.DownloadMusic);
        DownloadMusic.setOnClickListener(this);
        Button DownloadStatus = (Button) findViewById(R.id.DownloadStatus);
        DownloadStatus.setOnClickListener(this);
        DownloadStatus.setEnabled(false);
        Button CancelDownload = (Button) findViewById(R.id.CancelDownload);
        CancelDownload.setOnClickListener(this);
        CancelDownload.setEnabled(false);
        IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        registerReceiver(downloadReceiver, filter);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.DownloadImage:
                Uri image_uri = Uri.parse("آدرس عکس را در اینجا قرار دهید");
                Image_DownloadId = DownloadData(image_uri, v);
                break;
            //Download Music
            case R.id.DownloadMusic:
                Uri music_uri = Uri.parse("آدرس آهنگ را در اینجا قرار دهید");
                Music_DownloadId = DownloadData(music_uri, v);
                break;
            case R.id.DownloadStatus:
                Check_Image_Status(Image_DownloadId);
                Check_Music_Status(Music_DownloadId);
                break;
            case R.id.CancelDownload:
                downloadManager.remove(Image_DownloadId);
                downloadManager.remove(Music_DownloadId);
                break;
        }
    }
    private void Check_Image_Status(long Image_DownloadId) {
        DownloadManager.Query ImageDownloadQuery = new DownloadManager.Query();
        ImageDownloadQuery.setFilterById(Image_DownloadId);
        Cursor cursor = downloadManager.query(ImageDownloadQuery);
        if(cursor.moveToFirst()){
            DownloadStatus(cursor, Image_DownloadId);
        }
    }
    private void Check_Music_Status(long Music_DownloadId) {
        DownloadManager.Query MusicDownloadQuery = new DownloadManager.Query();
        MusicDownloadQuery.setFilterById(Music_DownloadId);
        Cursor cursor = downloadManager.query(MusicDownloadQuery);
        if(cursor.moveToFirst()){
            DownloadStatus(cursor, Music_DownloadId);
        }
    }
    private void DownloadStatus(Cursor cursor, long DownloadId){
        int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
        int status = cursor.getInt(columnIndex);
        int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON);
        int reason = cursor.getInt(columnReason);
        int filenameIndex = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
        String filename = cursor.getString(filenameIndex);
        String statusText = "";
        String reasonText = "";
        switch(status){
            case DownloadManager.STATUS_FAILED:
                statusText = "STATUS_FAILED";
                switch(reason){
                    case DownloadManager.ERROR_CANNOT_RESUME:
                        reasonText = "ERROR_CANNOT_RESUME";
                        break;
                    case DownloadManager.ERROR_DEVICE_NOT_FOUND:
                        reasonText = "ERROR_DEVICE_NOT_FOUND";
                        break;
                    case DownloadManager.ERROR_FILE_ALREADY_EXISTS:
                        reasonText = "ERROR_FILE_ALREADY_EXISTS";
                        break;
                    case DownloadManager.ERROR_FILE_ERROR:
                        reasonText = "ERROR_FILE_ERROR";
                        break;
                    case DownloadManager.ERROR_HTTP_DATA_ERROR:
                        reasonText = "ERROR_HTTP_DATA_ERROR";
                        break;
                    case DownloadManager.ERROR_INSUFFICIENT_SPACE:
                        reasonText = "ERROR_INSUFFICIENT_SPACE";
                        break;
                    case DownloadManager.ERROR_TOO_MANY_REDIRECTS:
                        reasonText = "ERROR_TOO_MANY_REDIRECTS";
                        break;
                    case DownloadManager.ERROR_UNHANDLED_HTTP_CODE:
                        reasonText = "ERROR_UNHANDLED_HTTP_CODE";
                        break;
                    case DownloadManager.ERROR_UNKNOWN:
                        reasonText = "ERROR_UNKNOWN";
                        break;
                }
                break;
            case DownloadManager.STATUS_PAUSED:
                statusText = "STATUS_PAUSED";
                switch(reason){
                    case DownloadManager.PAUSED_QUEUED_FOR_WIFI:
                        reasonText = "PAUSED_QUEUED_FOR_WIFI";
                        break;
                    case DownloadManager.PAUSED_UNKNOWN:
                        reasonText = "PAUSED_UNKNOWN";
                        break;
                    case DownloadManager.PAUSED_WAITING_FOR_NETWORK:
                        reasonText = "PAUSED_WAITING_FOR_NETWORK";
                        break;
                    case DownloadManager.PAUSED_WAITING_TO_RETRY:
                        reasonText = "PAUSED_WAITING_TO_RETRY";
                        break;
                }
                break;
            case DownloadManager.STATUS_PENDING:
                statusText = "STATUS_PENDING";
                break;
            case DownloadManager.STATUS_RUNNING:
                statusText = "STATUS_RUNNING";
                break;
            case DownloadManager.STATUS_SUCCESSFUL:
                statusText = "STATUS_SUCCESSFUL";
                reasonText = "Filename:\n" + filename;
                break;
        }
        if(DownloadId == Music_DownloadId) {
            Toast toast = Toast.makeText(MainActivity.this,
                    "Music Download Status:" + "\n" + statusText + "\n" +
                            reasonText,
                    Toast.LENGTH_LONG);
            toast.setGravity(Gravity.TOP, 25, 400);
            toast.show();
        }
        else {
            Toast toast = Toast.makeText(MainActivity.this,
                    "Image Download Status:"+ "\n" + statusText + "\n" +
                            reasonText,
                    Toast.LENGTH_LONG);
            toast.setGravity(Gravity.TOP, 25, 400);
            toast.show();
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                }
            }, 3000);
        }
    }
    private long DownloadData (Uri uri, View v) {
        long downloadReference;
        downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(uri);
        request.setTitle("Data Download");
        request.setDescription("Android Data download using DownloadManager.");
        if(v.getId() == R.id.DownloadMusic)
          request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DOWNLOADS,"Programchi.mp3");
        else if(v.getId() == R.id.DownloadImage)
          request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DOWNLOADS,"Programchi.jpg");
        downloadReference = downloadManager.enqueue(request);
        Button DownloadStatus = (Button) findViewById(R.id.DownloadStatus);
        DownloadStatus.setEnabled(true);
        Button CancelDownload = (Button) findViewById(R.id.CancelDownload);
        CancelDownload.setEnabled(true);
        return downloadReference;
    }
    private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if(referenceId == Image_DownloadId) {
                Toast toast = Toast.makeText(MainActivity.this,
                        "Image Download Complete", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP, 25, 400);
                toast.show();
            }
            else if(referenceId == Music_DownloadId) {
                Toast toast = Toast.makeText(MainActivity.this,
                        "Music Download Complete", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.TOP, 25, 400);
                toast.show();
            }
        }
    };
}

کد بالا خیلی طولانی شده به طور کلی توضیح میدم ولی شما با نگاه کردن به کد متوجه خواهید شد چه کاری انجام می دهد.
ما در آخر کد یک Broadcast داریم که بررسی کی کند که دانلود عکس یا آهنگ به پایان رسیده است یا خیر .
یک void به نام DownloadData وجود دارد که دو ورودی می پذیرد با استفاده از این فایل ها دانلود و در حافظه ذخیره می شود.
void بعدی DownloadStatus میزان پیشرفت دانلود و خطاهای مه ممکن است اتفاق بیفتد را بررسی می کند.
 
بقیه کد به عهده خودتان فقط یکسری شرط منطقی است !
 
این آموزش هم به پایان رسید.
 
موفق و پیروز باشید.

مطالعه بیشتر