استفاده از DownloadManager Android

استفاده از دانلود منیجر خود اندروید هم ساده است و هم سرعت کار را بالا می برد.

نحوه استفاده از آن به صورت زیر می باشد :

ابتدا یک آبجکت از نوع DownloadManager به روش زیر می سازیم .

DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

سپس یک آبجکت از نوع DownloadManager.Request

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(path));

که در اینجا path مسیر فایلی هست که قصد دانلود آن را داریم .

در request می توان ، هدر هم افزود :

request.addRequestHeader("X-Newshub-Originate-From", "mobile");
request.addRequestHeader("accept", "application/json");

و همین طور عنوان دانلودر در نوتیفیکیشن و محل دانلود و اسم فایل :

 
request.setTitle(DOWNLOAD_BAR_TITLE)
.setDescription(DOWNLOADING_DIALOG)
.setDestinationInExternalFilesDir(context, "", myFileName());

که در اینجا :

DOWNLOAD_BAR_TITLE همان تایتل دانلودر در نوتیفیکیشن هاست

DOWNLOADING_DIALOG توضیحی کوتاه در زیر تایتل

myFileName اسم فایل می باشد . چون در اینجا محل دانلود را خالی گذاشته ام “” ، به صورت پیش فرض در پوشه Android>Data>appPackage>files ذخیره می شود.

 

برای شروع دانلود از کد زیر استفاده می کنیم :

 
long enqueueId = downloadManager.enqueue(request);

enqueueId چیست ؟

در دانلود منیجر هرفایلی که برای دانلود درخواست می شود یک آی دی دارد که از نوع long می باشد.

با این آی دی می توان فایل را در دانلود منیجر پیدا کرد و از محل ذخیره شدن و وضعیت فایل اطلاع یافت و یا دانلود فایل را متوقف کرد .

پس لازم است که این آی دی را در دیتابیس خود ذخیره کنیم.

تموم حالا دانلود منیجر شروع به دانلود می کنه.

 

حالا اگه قصد دارید که زمان تموم شدن دانلود به برنامه اطلاع داده شود ، باید یک براد کاست رسیور درست کنید Broadcast Receiver

که هم میتونید توی خود اکتیویتی اون رو دریافت کنید هم میتونید توی مانیفست دریافت کنید که بهترین روش مانیفست است ، چون در صورت بسته شدن اکتیویتی رسیور هم غیر فعال می شود.

 

من یک رسیور در مانیفست AndroidManifest.xml درست کردم :

 
 
            
                
                
            
 

و یک کلاس به اسم DowloadCompleteChecker

 
public class DownloadCompleteChecker extends BroadcastReceiver {

که وظیفه این کلاس مطلع شدن از پایان دانلود و بدست آوردن وضعیف نهایی دانلود است .

 

 

 @Override
    public void onReceive(Context context, Intent intent) {
        downloadManager = (DownloadManager) context.getSystemService(context.DOWNLOAD_SERVICE);
        if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
            long id = intent.getLongExtra("extra_download_id", -1);
            // get Download manager query
            DownloadManager.Query query = new DownloadManager.Query();
            DownloadItem downloadItem = DataBaseAccess.getInstance().getDownloadItemById(id).get(0);
            query.setFilterById(downloadItem.id);
            Cursor cursor = downloadManager.query(query);
            if (cursor.moveToFirst()) {
               if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) {
                    handleDownloadFail(context, downloadItem, cursor);
               }else if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL) {
                    String mediaType = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_MEDIA_TYPE));
                    if (checkPdfType(mediaType)) {
                        // Successful set status and file path address
                        String uriString = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                        File mFile = new File(Uri.parse(uriString).getPath());
                        downloadItem.setLocalPath(mFile.getPath());
                        downloadItem.setSuccessfulIfNotDeleted();
                        DataBaseAccess.getInstance().updateDownloadItem(downloadItem, downloadItem.id);
                    } else {
                        handleDownloadFail(context, downloadItem, cursor);
                    }
              }
          }   
        }
    }

در این کد از
DownloadManager.Query query = new DownloadManager.Query();
استفاده شده تا به دانلود ها دسترسی
در این رسیور مقدار :
intent.getLongExtra(“extra_download_id”, -1);
آی دی فایلی که دانلود شده را می دهد که می توانیم با فایل خود چک کنیم
نکته : این رسیور برای هر دانلودی که توسط دانلود منیجر انجام می شود فراخوانی می شود، ممکن است برنامه دیگری قصد استفاده از دانلود منیجر را داشته باشد ، پس ابتدا باید آی دی را چک کنید .
در این کد دیتابیسی دارم که دارای یک سری دانلود آیتم می باشد و در هر کدام آدرس و آی دی و آخرین وضعیت ، در حال دانلود یا پاک شده و یا دانلود شده ، وجود دارد.
در ابتدا آیتمی را که دانلود شده از دیتابیس می گیرم و سپس وضعیف آن را چک و آپدیت می کنم.

 
                query.setFilterById(downloadItem.id);
                Cursor cursor = downloadManager.query(query);
                if (cursor.moveToFirst()) {
                    if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_FAILED) {

یا 
cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_SUCCESSFUL
برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا