Huawei Drive’a WorkManager ile Dosya Yükleme
Selamlar, bu yazımızda Huawei Drive’a WorkManager yardımıyla nasıl dosya yükleme görevi oluşturabileceğimizi keşfedeceğiz. Bunun için basit bir demo uygulama geliştireceğiz. Uygulamamızı geliştirirken de Kotlin dilini ve Android Studio ortamını kullanacağız.
Huawei Drive Kit
Drive Kit (Huawei Drive Kit’in kısaltması olarak kullanacağız) geliştiricilere kullanıcıların sahip olduğu Drive’ı (bulut depolama alanını) kullanmalarına olanak sağlayan bir kittir. Drive Kit ile uygulama verilerimizi kullanıcıların bulut depolarında saklayabilir, kullanıcılarla ilgili fotoğraf, video veya dokümanları kendi depolarında güvenle tutmalarını sağlayabiliriz.
Drive Kit’in sahip olduğu bazı fonksiyonlar:
- Kullanıcı bilgilerini edinme
- Dosyalar arasında arama yapma ve yönetimini sağlama
- Uygulama verilerini saklama
- Toplu işlemleri gerçekleştirme
Drive Kit ile ilgili daha fazla bilgiye bu bağlantıya tıklayarak erişebilirsiniz.
Biz yazımızda Account Kit’in ve Drive Kit’in projelere nasıl ekleneceği ile ilgili detaylara değinmeyeceğiz. Bu işlemleri çok basit şekilde resmi dokümanlar yardımıyla veya codelab desteği ile gerçekleştirebilirsiniz.
WorkManager
WorkManager bizim ertelenebilir asenkron görevler oluşturmamızı sağlayan, Android Jetpack içerisinde bulunan bir API’dır. Uygulamamız kapatılsa veya cihaz baştan başlatılsa bile oluşturduğumuz görevler kayıtlı kalır. Burada önemli nokta şu; WorkManager bize görevimizin gerçekleştirileceğinin garantisini verir, ama bunun için kesin bir zaman belirleyemeyiz. Görevlerimiz gerçekleştirilmeden önce çeşitli kısıtlar ekleyebiliriz ve WorkManager bu kısıtların karşılanmasını bekleyebilir. Bunun yanında batarya durumu, işlemci kullanımı gibi durumlara bakarak bataryadan tasarruf etme amacıyla bizim görevimizi erteleyip, uygun bulduğu zamanda görevimizi gerçekleştirir.
Örnek Proje: DriveWithWorkManager
Bu projede, kullanıcıların fotoğrafını WorkManager yardımıyla görev oluşturarak Drive Kit ile kullanıcıların Drive’larına yükleyeceğiz. Siz de bu örnekten yararlanarak yukarıda bahsettiğimiz gibi uygulama verileri, fotoğraflar, videolar veya dokümanlar gibi verileri Drive’a yüklemek için kullanabilirsiniz. WorkManager yardımıyla bu yükleme işlemimizin uygulamamız kapansa bile gerçekleşeceğinden emin olacağız.
Projenin Kurulumu
İlk olarak build.gradle (app level) dosyamıza gerekli bağımlılıklarımızı ekleyelim.
Layout Dosyası
activity_main.xml uygulamamızdaki tek layout(tasarım) dosyası olacak. Bu layout dosyasında iki tane buton bulunuyor. Bir tanesi Huawei ID ile giriş yapabilmek için, bir tanesi de görev oluşturabilmemiz için. Giriş işleminde kullandığımız Huawei ID butonuna ve kullanım kurallarına bu bağlantıdan ulaşabilirsiniz. Ayrıca kullanmış olduğumuzda Drive ikonunu da bu bağlantıdan indirebilirsiniz.
Depolama İzinleri
Cihazın depolama alanına erişeceğimiz için gerekli izinleri manifest dosyamıza ekleyelim.
Toplamda iki tane de kod dosyamız var. Bunlar MainActivity.kt ve UploadWorker.kt
Şimdi sırasıyla bu dosyalarımızı inceleyelim.
MainActivity
MainActivity.kt ->Drive fonksiyonlarımızı kullanabilmek için Huawei ID ile giriş yapmış olmamız gerekmektedir. Bu dosyada giriş işlemlerimizi gerçekleştirip WorkManager yardımıyla da yeni görev oluşturacağız.
Şimdi dosyamızda bulunan tüm fonksiyonlarımızın işlevlerini sırasıyla açıklamaya çalışalım.
onCreate() - API 23 ile birlikte, uygulamamızın gerek duyduğu izinleri kullanıcılara kullanım esnasında sormalıyız. Bu sebeple ilk olarak kullanıcılardan cihazlarının depolama alanlarını kullanabilmek basit bir şekilde izin istedik. Sonrasında da butonlarımızın tıklanmasını algılayabilmek için gerekli kodlarımızı ekledik.
signIn() - Drive’ı kullanmadan önce kullanacağımız fonksiyonlarıyla ilgili izinleri izin listesine eklemeliyiz. Sonrasında da giriş işlemini başlatıyoruz. Eğer siz Drive Kit’in farklı özelliklerini de kullanmak istiyorsanız, lütfen buraya o özellikle ilgili gerekli izini de eklemeyi unutmayın.
refreshAt() - HMS Core SDK aracılığıyla buradan yeni bir accessToken oluşturabiliriz.
checkDriveCode() - Burada ilk olarak unionId ile accessToken değerlerinin null veya boş olup olmadığı bakıyoruz. Sonrasında DriveCredential.Builder oluşturup geriye değer döndürüyoruz.
onActivityResult() - Burada giriş işlemimizin sonucunu alıyoruz ve AuthAccount yardımıyla yetki kodumuzu (authorization code) elde ediyoruz.
createWorkRequest() - Bu fonksiyonun işlevine ilk olarak WorkRequest hakkında kısaca bilgi verdikten sonra değinmek istiyorum.
Work Request Oluşturma
Bir work(iş) oluşturabilmek için workRequestleri kullanıyoruz. Uygulamamızda creatingWorkRequest fonksiyonuyla yeni bir work request oluşturabiliyoruz. İki çeşit work request bulunuyor. Bunlar OneTimeWorkRequest ve PeriodicWorkRequest. OneTimeWorkRequest ile bir kere çalışacak işler oluşturuyoruz. Basitlik olması açısından örnek uygulamamızda da bunu kullandık. PeriodicWorkRequest ile de periyodik olarak kendini tekrar etmesini istediğimiz işleri gerçekleştirebiliyoruz. Bu istekleri eğer iptal etmezsek, uygulama yüklü olduğu sürece, belirlediğimiz periyotlarda çalıştıracaktır.
UploadWorker
Oluşturmuş olduğumuz work’ün çalışma zamanı geldiğinde, WorkManager bir worker(işçi) çalıştıracaktır. Bu worker’ı tanımlamak için, bu classı(sınıfı) Worker sınıfından extend etmeliyiz(genişletmeliyiz). Kotlin kullananlar için, WorkManager bizlere coroutines desteği sunuyor. Yani UploadWorker sınıfımızı Worker sınıfından extend etmek yerine coroutines kullanmak için CoroutinesWorker sınıfından extend edebiliriz. Bu sınıflar ise iki tane parametre alıyor: context ve worker parameters.
Sonrasında, dowork fonksiyonunu override etmemiz gerekiyor. Dikkat ederseniz doWork fonksiyonumuz bir suspending fonksiyon. Bu sebeple burada asenkron işlemlerimizi-network işlemlerimizi gerçekleştirebiliriz.
Dispatchers.IO, Main thread dışında Network operasyonları da dahil olmak üzere I/O işlemlerinde kullanmamız için tasarlanmış bir yapıdır. Biz de withContext(Dispatchers.IO) ile kodlarımızın IO thread havuzunda çalışmasını sağlıyoruz.
MainActivity de workRequest oluşturken göndermiş olduğumuz accessToken ve unionId girdilerini alabilmek için inputData.getString kullanıyoruz. Sonrasında da Drive durumlarını kontrol ediyoruz. Eğer access code geçerliyse Drive Kit’i kullanmaya devam edebiliriz, aksi halde yenilememiz gerekecektir.
createAndUploadFile() - Bu fonksiyon ilk olarak Drive’da DriveWithWorkManager isminde yeni bir klasör oluşturuyor. Biz basitleştirmek amacıyla uygulamayı Android cihaza yükledikten sonra manuel olarak cihazın Android/data/com.huawei.drivewithwork/files klasörüne bir tane fotoğraf kaydetmiştik. Siz senaryonuza göre Drive’a yüklenecek fotoğrafı kullanıcının seçmesini de ekleyebilirsiniz. Sonrasında ise bu fotoğrafın dosya yolunu alıyoruz.
Drive Kit’te iki farklı yükleme yöntemi bulunuyor. Bunlar direct upload ve resumable upload. Biz uygulamamızda direct upload kullandık. Fakat yorum satırları olarak resumable upload’ın kullanımını da sizlere sunduk. Direct upload boyutu 20 MB’a kadar olan dosyaların yüklenmesine izin verirken, resumable upload için herhangi bir limit bulunmuyor. Ayrıca şunu da ekleyelim direct upload, boyutu maksimum 5 MB’a kadar olan dosyalar için kullanılması öneriliyor, eğer dosyanızın boyutu daha büyükse resumable upload kullanmanız tavsiye ediliyor.
Fotoğrafımızın dosya yolunu da aldıktan sonra artık her şey hazır. Dosyamızı Drive’a yükleyebiliriz. Uygulamamızı çalıştıralım ve ne olacağını görelim.
İlk olarak uygulamayı çalıştırıp Huawei ID yardımıyla girişimizi yapalım. Sonrasında “Create A Work Button” butonuna basarak yeni bir görev oluşturalım. Biz görevimizin çalışması için bazı şartlar belirlemiştik: en az 1 dakika sonra çalışsın, cihaz internete bağlı olsun ve bataryası düşük seviyede olmasın. Eğer bizim belirlediğimiz koşullar gerçekleşir, görevin gerçekleşmesini engelleyecek başka herhangi bir durum da yoksa görevimiz çalıştırılacak ve fotoğrafımız Drive’a yüklenecektir. Aşağıdaki fotoğrafta uygulamamızın Huawei Drive’da oluşturduğu klasörü ve içerisine yüklediğimiz fotoğrafı görebilirsiniz.
İpuçları ve Tüyolar
- Uygulamanızda kullanıcı ile ilgili saklamanız gereken uygulama ayarları, dosyalar var ise Drive’da bulunan app klasörünün içerisinde saklayabilirsiniz. Bu klasöre kullanıcıların erişimi bulunmamaktadır. Klasöre doğrudan uygulamanız aracılığıyla erişebilirsiniz ve kendi uygulamanız haricinde diğer uygulama dosyalarına erişemezsiniz.
- Eğer indirmek veya yüklemek istediğiniz dosyanın boyutları büyük ise, WorkManager aracılığıyla workRequest oluştururken kısıt olarak NetworkType.UNMETERED kısıtını ekleyebilirsiniz. Bu sayede kullanıcılar eğer sınırlı internet kullanmıyorlarsa bu işlemleri gerçekleştirecektir. Bu da işlemin kullanıcıya olan maliyetini azaltacaktır.
Sonuç
Bu yazımızda özet olarak Drive Kit ile WorkManager’ı nasıl birlikte kullanabileceğimizi öğrendik. Bunu yaparken de kullanıcının cihazında bulunan fotoğrafı yine kullanıcının Drive’ına yükleme işlemi yapan bir örnek uygulama geliştirdik. Dosya yüklemenin yanında Drive Kit bizlere dosya okuma, yazma ve senkronize etme gibi birçok özellikler sunuyor. Çok basit bir şekilde tüm bu özellikleri de uygulamanızda kullanabilirsiniz. Karşılaştığınız sorunları veya sorularınızı yorum olarak yazabileceğiniz gibi aşağıdaki bağlantı aracılığıyla Huawei Geliştirici Forumu üzerinden de sorabilirsiniz.
Zaman ayırdığınız için teşekkürler, umarım yararlı olmuştur. Bir sonraki yazımızda görüşmek üzere…
Referanslar
Huawei Drive Kit Resmi Dokümanı
Huawei Drive Kit Resmi Codelab
WorkManager Resmi Dokümanı