Android – Dosya İndirmek ve Kaydetmek

 

Merhaba dostlar, bugün sizinle uygulamamızda kullanıcıya bir dosya indirtmek istediğimiz zaman bunu nasıl gerçekleştireceğiz onu konuşacağız. Hazırladığım örnek uygulamamın github repo linkini de yazının sonunda bulabilirsiniz. Oradan fork ederek kodun detaylarına da bakabilirsiniz. Hemen başlayalım.

Öncelikle örneğimizdeki senaryo şu şekilde olacak; kullanıcıya her türlü dosyayı indirtebiliriz, biz örneğimizde bir jpeg dosyası üzerinde çalışacağız. Uygulamamız açıldığında indirilmek istenen dosyanın ön izlemesi bir imageview ile kullanıcıya gösterilecek, indir butonu ile de bu dosya indirilecek. Şimdi aşamalar ile devam edelim.

 

1) İzinlerin AndroidManifest.xml Dosyasında Tanımlanması

 

İnternetten bir dosya indirme ve dosya dizinine yazma işlemi için 3 tane permission vermemiz gerekiyor dostlar, bunlar; INTERNET, WRITE_EXTERNAL_STORAGE ve ACCESS_NETWORK_STATE. İnternet adında anlaşılacağı gibi interneti kullanabilmesi için uygulamamızın. write_external_storage ise herhangi bir dosyayı telefona kaydedebilmemiz için gerekli izindir. access_network_state de ağ durumunu kontrol edebilmemize yarıyor. şimdi application tag’lerinden önce permissionlarımızı ekleyelim.

AndroidManifest.xml






 

2) İndirilecek Dosyanın Ön izlemesi için Glide Kütüphanesini Eklemek

 

İmageview‘de indirilecek dosyanın ön izlemesini göstermek için Glide adlı kütüphaneyi projemize ekliyoruz. Bunu kütüphane olmadan da yapabiliriz ama bu yazının konusunu bu olmadığı için Glide ile sorunumuzu kolay bir şekilde çözeceğiz.

Projemizde bulunan build.gradle (Module:app) dosyasını açalım ve kütüphanelerimizin olduğu dependencies kısmına aşağıdaki eklemeleri yapalım ve devam edelim.


dependencies {

    implementation 'com.github.bumptech.glide:glide:4.7.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'

    ...
}

 

3) XML Dosyasının oluşturulması

 

XML kısmında bir adet imageview bir adet de button‘ımız olacak, yukarıda bahsettiğim gibi imageview indirilecek dosyanın preview’ini görebilmek için koyduğumuz bir bileşen, button ise indirme işlemini başlatmamız için.

activity_main.xml





    

 

4) Java Dosyamızı Oluşturmak ve Fonksiyonlarımızı Yazmak

 

Java dosyamızda sırası ile indirmek istediğimiz dosyayı imageview’de gösteriyoruz, butona tıklandığında ise indirme işlemi başlıyor ve sonrasında gallery’deki download dizinine kaydediliyor. Kodun açıklamaları üzerindedir, oradan ayrıntılı bir şekilde hangi fonksiyonun neden kullanıldığı anlatıldı.

MainActivity.java


package net.ahmetkilinc.downloadfileexample;

import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.bumptech.glide.Glide;


public class MainActivity extends AppCompatActivity {

    //indirilecek dosyamızın url'sini tutacak String
    private String indirilecekDosyaYolu;
    //ön izlememizi gösterecek ImageView
    private ImageView ivIndirmedenOnceGoster;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //xml dosyamızda tanımladığımız button ve imageview'i tanımladık.
        ivIndirmedenOnceGoster = findViewById(R.id.imageViewKratos);
        Button btnDosyayiIndir = findViewById(R.id.buttonIndir);

        //String'e url yi yazıyoruz. Burada siz uygulamanıza göre gereken url'yi atayacaksınız.
        indirilecekDosyaYolu = "https://ahmetkilinc.net/wp-content/uploads/2018/08/kratos-emoji.jpeg";

        //Glide kütüphanesini kullanarak url deki jpeg dosyasını imageview de gösterdik.
        Glide.with(this).load(indirilecekDosyaYolu).into(ivIndirmedenOnceGoster);

        //uygulama ilk açıldığında dosyayı telefona kaydetmek için izin alacağımız fonksiyon.
        haveStoragePermission();

        //indir butonuna tıklandığında olacaklar.
        btnDosyayiIndir.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String url = indirilecekDosyaYolu;
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                request.setDescription("God of War");
                request.setTitle("KRATOOOS");

                //burada çok çok eski bir sürüm için gerekli bir denetleme yapıyoruz. bu kısmı kaldırabilirsiniz.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                }

                //dosyayı yazacağımız yer ve dosyanın ismine karar verebiliyoruz.
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "kratos.jpeg");

                //download servisini çalıştırma ve kuyruğa alması
                DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                manager.enqueue(request);
            }
        });
    }

    //kullanıcıdan yazma işi için izin alma fonksiyonumuz.
    public  boolean haveStoragePermission() {

        //izin alma işlemi api level 23'den sonra geldiği için onu kontrol ediyoruz.
        if (Build.VERSION.SDK_INT >= 23) {

            //manifestteki izin kontrol ediliyor.
            if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {

                Log.e("Permission error","You have permission");
                return true;
            } else {

                Log.e("Permission error","You have asked for permission");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                return false;
            }
        }

        // kullanıcı 23'den eski bir sistem kullanıyorsa izin alma işlemi yapılmadan devam ediliyor.
        else {
            Log.e("Permission error","You already have the permission");
            return true;
        }
    }
}


 

Evet dostlar bugün sizinle android‘de dosya indirmeye baktık, umarım bir gün işinize yarar. Örnek uygulamamın linkine şurayı tıklayarak ulaşabilirsiniz.

Dip Not: Kratos’un emojisi hakkındaki düşüncelerinizi de yorum olarak atabilirsiniz.

ahmet

Ahmet Kılınç - Software Developer

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Ali BEY dedi ki:

    Tamda araştırdığım bir konuydu.Teşekkürler Ahmet Bey .

  2. yavuz dedi ki:

    çok teşekkürler kod için ellerinize sağlık düşündüğüm şeyi sayenizde hiç zorlanmadan yaptım iyiki sizin gibi insanlar var tekrar teşekkürler iyi çalışmalar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.