Android Download Manager Kullanımı (Örnek Kod)

Merhaba Arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslere Androidde DownloadManager classını kullanarak istediğimiz linkten veri indirme dersi ile devam edeceğiz.Hepimizin malumudur ki bazen uygulama içinden cihaza yada direk uygulamamızın içine dosya download etmemiz gerekir.İşte burda Android 2.3 (Api 9) üzerinde çalışan DownladManager classı işimizi çok ama çok kolaylaştırıyor.

Arkadaşlar ben her zamanki gibi ufak bir uygulama üzerinde anlatacağım dersimizi. Uygulamamızda bir tane edittext iki tane buton var. Butonlardan biri, edittext alanına girilen url değerini alıyor ve gerekli kontrolleri yaptıktan sonra indirme işlemine başlıyor. Gerekli kontroller nedir diye sorarsanız, ben uygulamada iki kontrol yaptım.
1- Link “http://” ile başlayıp başlamadığı kontrolü
2- Linkteki indireceğimiz dosyanın uzantı kontrolü istediğim formattımı.
Siz daha fazlada kontrol yapabilirsiniz.
Diğer buton ise download işlemi bittiğinde enable oluyor ve tıklandığı zaman indirilme listesini açıyor.

DownloadManager Kullanımı

Evet arkadaşlar geçelim kodlamaya.Kod üzerinde gerekli açıklamaları yapmaya çalıştım .
[wpdm_file id=18]

Anasayfa.java


import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.app.DownloadManager.Query;
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.view.View;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Anasayfa extends Activity {
	Button indir,indirmeListesi;
	EditText link_edit;
	String link;
	private long sira;
    private DownloadManager dm; 

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.anasayfa);
		link_edit = (EditText)findViewById(R.id.editText1);//Edittext alanımızı tanımlıyoruz

		 BroadcastReceiver receiver = new BroadcastReceiver() {//BroadCast Receiver kullanma sebebimiz downloadın bittiğini koda iletebilmek için
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {//Eğer indirme başarılı ise dosyayı açacağız
                	sira = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);//İndirilen dosyanın Downloads daki sırasını alıyoruz
                    Query query = new Query();
                    query.setFilterById(sira); //Sıraya göre sorguluyorz
                    Cursor c = dm.query(query);//Sorgu sonucunu Cursor a iletiyoruz
                    if (c.moveToFirst()) {
                        int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);

                        if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { //İndirme Başarılı ise

                        	String dosyaAdi = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE)); //Dosya adını alıyoruz

                        	Toast.makeText(getApplicationContext(), dosyaAdi+" Başarıyla indi", Toast.LENGTH_LONG).show();
                        	indirmeListesi.setEnabled(true);//İndirme Listesindeki butonu enable ediyoruz

                        }else{
                        	Toast.makeText(getApplicationContext(), "Hatalı Link", Toast.LENGTH_LONG).show();
                        }
                    }
                }
            }

        };

        registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));//BroadCast Reciverı DownloadManageri dinlemesi için başlatıyoruz

		indir = (Button) findViewById(R.id.button1);
		indirmeListesi = (Button)findViewById(R.id.button2);

		indir.setOnClickListener(new View.OnClickListener() {//indir butonu tıklanınca

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				link = link_edit.getText().toString();
				if (!link.startsWith("http://") && !link.startsWith("https://")){//link http ile başlamıyorsa ekliyoruz yoksa hata veriyor
					link = "http://" + link;
				}

				String extension = MimeTypeMap.getFileExtensionFromUrl(link);  //indireceğimiz file uzantısını alıyoruz
		           if (extension != null) {
		                MimeTypeMap mime = MimeTypeMap.getSingleton();
		                String mimeType = mime.getMimeTypeFromExtension(extension);
		                if (mimeType != null) {  //Uzantı istediğimşiz formattamı kontrol ediyoruz
		                     if (mimeType.toLowerCase().contains("pptx")   || extension.toLowerCase().contains("pdf")
											                               || extension.toLowerCase().contains("doc")
											                               || extension.toLowerCase().contains("ppt")
											                               || extension.toLowerCase().contains("png")
											                               || extension.toLowerCase().contains("jpg")){//istedimiz formatta ise indirme işlemine geçiyoruz

		                    	dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);//DownloadManager objesi oluşturuyoruz
		     			        Request request = new Request(Uri.parse(link)); //İndireceğimiz linki veriyoruz
		     			        sira = dm.enqueue(request);//indirmeye başlıyoruz.Geriye download sırasını döner

		                     }else{
		                        Toast.makeText(getApplicationContext(), "Geçersiz Uzantı", Toast.LENGTH_LONG).show();
		                     }

	                     }
		           }

			}
		});

		indirmeListesi.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {//İndirilenler Listesini açar
				// TODO Auto-generated method stub
			    Intent i = new Intent();
		        i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
		        startActivity(i);
			}
		});

	}

}

Evet arkadaşlar bu dersimde anlatmak istediklerim bu kadar. Sormak istediğiniz yada eklemek istediğiniz bir şey olursa çekinmeden yorum bırakabilirsiniz.

Bir dahaki dersimde Notification göndermeye yarıyan Google Cloud Messaging (GCM) anlatmaya çalışacağım. Sizlerden ricam facebook.com/mobilhanem sayfamızı beğenmeniz ve yazılımcı arkadaşlarınız ile paylaşmanızdır.

Bir dahaki dersimde görüşmek dileğiyle…

[wpdm_file id=18] 1

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

11 Yorum

  • Download edilen dosyanın ilerleme durumunu gerçek zamanlı olarak yakalayıp kendi activity’imiz içerisinde nasıl gösterebiliriz peki ?

      • Teşekkür ederim. İki Tab’dan oluşan bir download activity var. İlk tab içerisinde bir ListView yer alıyor. Bunun içerisinde indirilecek dosyaların listesi yer alıyor.

        İndirme butonlarına basınca indirme DownloadManager ile iniyor. İkinci tabda ise İndirilenler adından bir liste var ve listenin görünümü ise eğer indirme bitmediyse bir progressbar ve yüzde işareti. Tam olarak böyle bir şey yapmak istiyorum 🙂 Bu tarz bir ders hazırlarsanız çok faydalı olacaktır.

  • Kolay gelsin hocam. Bu indirme için edittext e url girişi ve indirme butonuna basarak indirme yerine Webviewde açılan sayfadaki indirme butonuna bastığımızda dosyayı indirecek bir link yapamaz mıyız? bu konuda yardımcı olursanız sevinirim.

    Aklımda şöyle birşey var ama olurmu bilmiyorum. Webviewde açılan sayfadaki herhangi bir linke tıkladığınızda o sayfayı açıyor. Burada bir kontrol yaptırsak tıklanan linkteki uzantıyı kontrol ettirsek atıyorum .mp3 .jpg vs ise download işlemini başlatsın istiyorum. bu işlemi aşağıdaki kod içinde yapsan olur mu acaba?

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // Bu method açılan sayfa içinden başka linklere tıklandığında açılmasına yarıyor.
    //Bu methodu override etmez yada edip içini boş bırakırsanız ilk url den açılan sayfa dışında başka sayfaya geçiş yapamaz

    view.loadUrl(url); //yeni tıklanan url i açıyor

    return true;
    }

  • Merhaba ,yapmaya çalıştığım uygulama gün içerisinde çoğunlukla offline çalışacağından uzak sunucuda bulunan resimleri cihaza çekmem gerekiyor ve yaklaşık 50 000 adet ürün resimi var bunun için hangi yöntemi kullanmalıyım sizce…remleri sqlite byte dizisi olarak kayıt edebilirmiyim bunun içi hangi yöntem hızlı olur.AsyncTask ile bellek memory hatası alıyorum.volley veya download menager iş görürmü?

  • İndirilenler listesini değilde, indirdiğimiz şeyi tekrar progam üzerinden nasıl açarız ? Tam olarak sd kartta hangi dosya uzantısında yer alıyor inen dosya?

  • Verdiğiniz kodları kendime göre düzenleyip programı oluşturdum resim linki yapıştırdığımda dowload a tıklayınca hiçbirşey olmuyor sonu .jpg olan link yapıştırdığımda ise indirme işlemi durduruldu hatası verip progrmı kapatıyor neden olabilir ve ayrıca anroidmanifest dosyasında bir değişiklik yapmak gerekiyormu?

  • Arkadaşlar eğer folder yoksa Folder açmanız gerek mp3 tarzı bir sistem kuracaksanız
    String folder = sdCard.getAbsolutePath() + “/klasöradı” ;
    File dir = new File(folder );
    if (!dir.exists()) {
    if (dir.mkdirs()) {

    }
    }
    request.setDestinationInExternalPublicDir(“/klasöradı”, “dosyaadi.uzanti”);
    şeklinde düzenleyeceksiniz

  • İndirilen dosya “İndirilenler” de görünmeden dahili diskte özel bir klasorde saklayabilirmiyim.

  • hocam indirme işlemi başarılı fakat şunları yapamadım..

    1-indirilen dosyayı silemiyorum aslında silindi gösteriyor ama indirilenleri göster dediğimde orada görüyorum diğer indirdiklerimle birlikte örneğin update.apk indiriyorum işim bitince file yeni=new file(path) yeni.delete(); şeklinde siliyorum ama aynı isimle tekrar dosyalar görüyorum.. update.apk varsa silip yeni update.apk dosyasını indirmem gerekiyor.

    2-inen dosyayı kod ile Install edemiyorum..

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?