آموزش دانلود فایل بدون کتاب خانه در اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش دانلود فایل بدون کتاب خانه در اندروید می پردازیم با این آموزش می توانید یک 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 میزان پیشرفت دانلود و خطاهای مه ممکن است اتفاق بیفتد را بررسی می کند.
بقیه کد به عهده خودتان فقط یکسری شرط منطقی است !
این آموزش هم به پایان رسید.
موفق و پیروز باشید.
آموزش برنامه نویسی اندروید |
سلام.من به تازگی با سایتتون اشنا شدم.خیلی اموزشای کاربردی خوبی دارید.به شخص تحسین میکنم.هرکمکی از دستم بربیاد برای معرفی سایتتون انجام میدم.متشکر از سایت فوق العاده تون.
id : @pejmanjahangiri
خیلی ممنون لطف دارید.
آفرین بر شما – سایت عالی با کد های بسیار عالی و تست شده – خداوند به شما عمر با عزت و سلامتی بده – واقعا ممنون-
سایت کم خطایی هست فقط احیانا این کد
setContentView(R.layout.content_main);
رو ارجاع میده که باید
activity_main
رو ارجاع بده ولی بقیه کدهای شما بدون خطا اجرا میشه که توی راهنماهای فارسی یه شاهکاره
بازم خسته نباشید
سلام خیلی ممنون نظر لطف شماست
و تشکر برای ارجاع خطا
موفق باشید.
با عرض تشکر مهندس دانلود فایل ( هر نو فایلی) با کتابخانه Volley چه طوریه؟؟
با کدی که قرار دادیم هر نوع فایلی رو می توانید دانلود کنید.
سلام استاد وقت بخیر
من یه پروژه دانلود فیلم دارم میسازم وقتی که دانلود فیلمی را شروع میکنم نمیتونم به صفحه دیگه ای برم و برگردم من نیاز دارم که بین فرگمنت ها گردش کنم ووقتی هم به همون فرگمنت فیلم رفتم میزان دانلودم نمایش داده بشه
سلام و درود
شما باید از notificationbar استفاده کنید و نه از progressDialog و مقدار آن را آپدیت کنید در هربار باید یک متغیر global هم داشته باشید که مقدار progress توش باشه و زمانی که برگشتید به همون اکتیویتی میزان دانلود را نمایش دهد چون وقتی دکمه کلیک می شود عمل destroy اکتیویتی انجام می شود شما باید این کار رو در یک service قرار دهید تا عمل دانلود تضمین شود.
موفق باشید.
سپاس از راهنمایتان
سلام ممنون از اموزش خوبتون فقط یک سوال داشتم من بخام بطور افلاین بدون اینترنت فایل عکس یا فیلم دانلود کنم باید چکار کنم
سلام
به صورت آفلاین ! ؟
سلام منظورم اینکه یک فایل عکس psd و چندین عکس pngدارم و فیلم اموزشی که انحصاری و بخاطر اینکه سایت ندارم میخوام از تو برنامه بدون وصل شدن به اینترنت کاری کنم که کاربر بتونه دانلود کنه هر چند میدونم حجم برنامه دارم میبرم بالا ولی همچین کاری میشه کرد
باتشکر
سلام و درود
بله می شود همچین کاری کرد شما در آن زمان دیگر نیاز به دانلود فایل ندارید می توانید در پوشه assets , raw قرار دهید از آنجا خوانده و ذر برنامه نمایش دهید هرچند که کار منطقی نیست بهتر بود ویدیو ها درون هاست بودش و به صورت stream نمایش میدادید.
ممنون از پاسخ شما فقط یک موضوع باید لینک اون فایلو قرار داد واینکه با کتابخانه هم میشه این کارو کرد
باتشکر
با سلام
در مورد retrofit سوال داشتم.با این کتابخونه میشه فایلهایی با حجم بالا مثلا ۵۰ مگ یا بیشتر هم دانلود کرد؟
من یه کدی نوشتم فقط هر بار که کلیک میشه باز اون رو دانلود میکنه من میخوام که یه دستوری باشه اگه دانلود شده و موجود هست . دفعه بعد اون رو نشون بده