آموزش دانلود فایل بدون کتاب خانه در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش دانلود فایل بدون کتاب خانه در اندروید می پردازیم با این آموزش می توانید یک Download Manager برای خودتان ایجاد کنید کلاس Download Manager از api 9 به اندروید اضافه شد این کلاس برای انجام دانلود های طولانی در background مورد استفاده قرار می گیرد از در ادامه به ویژگی های فوق العاده آن خواهیم پرداخت با ما همراه باشید.
پیشنهاد می کنم در صورتی از این آموزش استفاده کنید که نمی خواهید از هیچ کتاب خانه استفاده کنید چون دانلود فایل با کتاب خانه های volley و Retrofit از بهترین روش برای دانلود فایل در اندروید است که آموزشش در سایت موجود هست.
ویژگی دانلود منیجر ما :
- دانلود عکس و آهنگ از هر آدرس (امکان دانلود دیگر نوع فایل هم وجود دارد) باید extension را تغییر دهید.
- نمایش میزان پیشرفت دانلود در هر ثانیه.
- امکان ذخیره آنها در مسیر های مختلف.
- زمانی که دانلود به پایان برسد یک Notification ارسال می شود.
- امکان Cancel کردن دانلود نیز وجود دارد.
در ابتدای کار وارد فایل AndroidManifest.xml شده و دتسرسی های زیر را اضافه کنید.
1 2 3 | <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 است و کدهای زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <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 همانند زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | 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 میزان پیشرفت دانلود و خطاهای مه ممکن است اتفاق بیفتد را بررسی می کند.
بقیه کد به عهده خودتان فقط یکسری شرط منطقی است !
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
سلام.من به تازگی با سایتتون اشنا شدم.خیلی اموزشای کاربردی خوبی دارید.به شخص تحسین میکنم.هرکمکی از دستم بربیاد برای معرفی سایتتون انجام میدم.متشکر از سایت فوق العاده تون.
id : @pejmanjahangiri
خیلی ممنون لطف دارید.
آفرین بر شما – سایت عالی با کد های بسیار عالی و تست شده – خداوند به شما عمر با عزت و سلامتی بده – واقعا ممنون-
سایت کم خطایی هست فقط احیانا این کد
setContentView(R.layout.content_main);
رو ارجاع میده که باید
activity_main
رو ارجاع بده ولی بقیه کدهای شما بدون خطا اجرا میشه که توی راهنماهای فارسی یه شاهکاره
بازم خسته نباشید
سلام خیلی ممنون نظر لطف شماست
و تشکر برای ارجاع خطا
موفق باشید.
با عرض تشکر مهندس دانلود فایل ( هر نو فایلی) با کتابخانه Volley چه طوریه؟؟
با کدی که قرار دادیم هر نوع فایلی رو می توانید دانلود کنید.
سلام استاد وقت بخیر
من یه پروژه دانلود فیلم دارم میسازم وقتی که دانلود فیلمی را شروع میکنم نمیتونم به صفحه دیگه ای برم و برگردم من نیاز دارم که بین فرگمنت ها گردش کنم ووقتی هم به همون فرگمنت فیلم رفتم میزان دانلودم نمایش داده بشه
سلام و درود
شما باید از notificationbar استفاده کنید و نه از progressDialog و مقدار آن را آپدیت کنید در هربار باید یک متغیر global هم داشته باشید که مقدار progress توش باشه و زمانی که برگشتید به همون اکتیویتی میزان دانلود را نمایش دهد چون وقتی دکمه کلیک می شود عمل destroy اکتیویتی انجام می شود شما باید این کار رو در یک service قرار دهید تا عمل دانلود تضمین شود.
موفق باشید.
سپاس از راهنمایتان
سلام ممنون از اموزش خوبتون فقط یک سوال داشتم من بخام بطور افلاین بدون اینترنت فایل عکس یا فیلم دانلود کنم باید چکار کنم
سلام
به صورت آفلاین ! ؟
سلام منظورم اینکه یک فایل عکس psd و چندین عکس pngدارم و فیلم اموزشی که انحصاری و بخاطر اینکه سایت ندارم میخوام از تو برنامه بدون وصل شدن به اینترنت کاری کنم که کاربر بتونه دانلود کنه هر چند میدونم حجم برنامه دارم میبرم بالا ولی همچین کاری میشه کرد
باتشکر
سلام و درود
بله می شود همچین کاری کرد شما در آن زمان دیگر نیاز به دانلود فایل ندارید می توانید در پوشه assets , raw قرار دهید از آنجا خوانده و ذر برنامه نمایش دهید هرچند که کار منطقی نیست بهتر بود ویدیو ها درون هاست بودش و به صورت stream نمایش میدادید.
ممنون از پاسخ شما فقط یک موضوع باید لینک اون فایلو قرار داد واینکه با کتابخانه هم میشه این کارو کرد
باتشکر
با سلام
در مورد retrofit سوال داشتم.با این کتابخونه میشه فایلهایی با حجم بالا مثلا ۵۰ مگ یا بیشتر هم دانلود کرد؟
من یه کدی نوشتم فقط هر بار که کلیک میشه باز اون رو دانلود میکنه من میخوام که یه دستوری باشه اگه دانلود شده و موجود هست . دفعه بعد اون رو نشون بده