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.
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
Download edilen dosyanın ilerleme durumunu gerçek zamanlı olarak yakalayıp kendi activity’imiz içerisinde nasıl gösterebiliriz peki ?
Bu bahsettiin durum için farklı bir ders yazmam gerekir. Çünkü burda download yaparken DownloadManager yardımı ile indiriyoruz. Ama senin dediğinde ekranda inme durumunu göstermek için kendi Activity miz içinde indirmemiz lazım. Bunun için örnek istersen şu derse bakabilirsin
http://www.java-samples.com/showtutorial.php?tutorialid=1521
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.
Internal storage kullanman gerekir. Internal storage app’e özel data saklar.
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..