How to file upload Jetpack Compose Android?

Bahadireray
3 min readFeb 13, 2024

--

Merhaba, sizlere bu yazımda android cihaz üzerinden dosya seçme ve o dosyayı nasıl kullanıp upload gibi işlemleri nasıl yapabilirsiniz anlatmaya çalışacağım.

Öncelikle Manifest dosyamızdan hangi izinlere ihtiyacımız olduğunu belirtmemiz lazım.


<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
if (isGranted) {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show()
openFilePicker()
} else {
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show()
}
}

Bu kod parçası, Android’de izin isteme işlemini gerçekleştirir. İzin istendiğinde kullanıcıya bir ileti gösterir ve kullanıcının izin verip vermediğini kontrol eder.

  1. registerForActivityResult fonksiyonu, etkinlik sonuçlarını dinlemek için bir başlatıcı (launcher) oluşturur. ActivityResultContracts.RequestPermission() argümanı, izin isteme işlemi için kullanılacak olan başlatıcı türünü belirtir.
  2. Başlatıcı, izin isteği sonucunda çalışacak olan bir lambda ifadesi alır. Bu ifade, isGranted adında bir boolean değeri parametre olarak alır. Bu değer, izin isteğinin sonucunda verilen iznin durumunu gösterir. Eğer true ise, izin verilmiş demektir. Eğer false ise, izin verilmemiş demektir.
  3. Eğer izin verilmişse, Toast.makeText() fonksiyonu ile kullanıcıya "Permission granted" (İzin verildi) mesajını gösterir ve openFilePicker() fonksiyonunu çağırarak dosya seçiciyi açar.
  4. Eğer izin verilmemişse, Toast.makeText() fonksiyonu ile kullanıcıya "Permission denied" (İzin reddedildi) mesajını gösterir.

Bu kod parçası, izin isteme işleminin sonuçlarını ele almak ve buna göre gerekli adımları atmak için kullanılır.

  @Composable
fun FilePickerScreen() {
var permissionGranted by remember { mutableStateOf(false) }

Column(
modifier = Modifier
.padding(16.dp)
.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Button(onClick = {
if (checkPermission()) {
permissionGranted = true
openFilePicker()
} else {
requestPermission()
}
}) {
Text(text = "Select File")
}
}
}
  1. FilePickerScreen adında bir Composable fonksiyon tanımlar.
  2. permissionGranted adında bir mutableStateOf değişkeni oluşturur. Bu değişken, dosya seçme izni verildiğinde veya reddedildiğinde durumu tutar.
  3. Column bileşeni içinde bir düğme (button) yer alır. Bu düğme, "Select File" metni ile görüntülenir.
  4. Düğmenin tıklanma (onClick) işlemi tanımlanır. Tıklama işlemi, dosya seçme izni kontrolüne dayanır.
  5. checkPermission fonksiyonu kullanarak dosya okuma izni kontrol edilir. Eğer izin verilmişse, permissionGranted değişkeni true olarak ayarlanır ve openFilePicker() fonksiyonu çağrılarak dosya seçici açılır.
  6. Eğer izin verilmemişse, requestPermission() fonksiyonu çağrılarak izin istenir.

Bu kod parçası, dosya seçme işlemi için bir arayüz sunar ve kullanıcı izni gerektiğinde izin isteme işlemini başlatır.

  private fun checkPermission(): Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.READ_EXTERNAL_STORAGE
) == android.content.pm.PackageManager.PERMISSION_GRANTED
}

private fun requestPermission() {
requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
}

private fun openFilePicker() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
type = "application/pdf"
}
startActivityForResult(intent, REQUEST_CODE_PICK_FILE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_PICK_FILE && resultCode == RESULT_OK) {
data?.data?.let { uri ->
val filePath = getRealPathFromURI(uri)
Toast.makeText(this, "Selected file path: $filePath", Toast.LENGTH_SHORT).show()
}
}
}

private fun getRealPathFromURI(uri: Uri): String? {
val cursor = contentResolver.query(uri, null, null, null, null)
return cursor?.use {
it.moveToFirst()
val columnIndex = it.getColumnIndex(DocumentsContract.Document.COLUMN_DISPLAY_NAME)
it.getString(columnIndex)
} ?: uri.path
}

companion object {
private const val REQUEST_CODE_PICK_FILE = 1001
}
}
  1. checkPermission() Fonksiyonu:
  • Harici depolama iznini kontrol eder.
  • ContextCompat.checkSelfPermission() fonksiyonu kullanılarak, belirli bir iznin (burada harici depolama izni) verilip verilmediği kontrol edilir.
  • İzin verilmişse true, aksi halde false döndürülür.

2. requestPermission() Fonksiyonu:

  • Harici depolama iznini istemek için requestPermissionLauncher aracılığıyla başlatılır.
  • İzin talebi, Manifest.permission.READ_EXTERNAL_STORAGE kullanılarak belirtilir.

3.openFilePicker() Fonksiyonu:

  • Dosya seçme işlemini başlatmak için bir Intent oluşturur.
  • Intent.ACTION_OPEN_DOCUMENT eylemi kullanılarak dosya seçici açılır.
  • Sadece açılabilir dosyaların görüntülenebilmesi için Intent.CATEGORY_OPENABLE kategorisi eklenir.
  • Dosya türü application/pdf olarak belirlenir.

4.onActivityResult() Fonksiyonu:

  • startActivityForResult() ile başlatılan bir etkinlik sonucu işlenir.
  • REQUEST_CODE_PICK_FILE kodu ile başlatılan etkinlik kontrol edilir.
  • Sonuç RESULT_OK ise (yani dosya seçme işlemi başarılı olduysa):
  • data?.data ifadesi ile dönen veri (dosya URI'si) alınır.
  • Bu URI, getRealPathFromURI() fonksiyonu kullanılarak gerçek dosya yoluna dönüştürülür.
  • Elde edilen dosya yolunu kullanarak bir Toast mesajıyla kullanıcıya bildirim gösterilir.

5.getRealPathFromURI() Fonksiyonu:

  • Bir URI’yi alır ve ona karşılık gelen gerçek dosya yolunu bulur.
  • contentResolver.query() ile verilen URI'yi çözümler.
  • Dosya yolunu elde etmek için DocumentsContract.Document.COLUMN_DISPLAY_NAME sütununu kullanır.
  • Elde edilen gerçek dosya yolu veya URI’nin path’i döndürülür.

6.REQUEST_CODE_PICK_FILE Sabiti:

  • Dosya seçme işlemi için istek kodunu tanımlar.

Dosya seçme işlemi sırasında gerekli adımları gerçekleştirir ve sonuçları işler.

Bir başka Android yazımda görüşmek üzere, güzel günler dilerim. :)

Bütün kodlarını aşağıdaki github adresinde bulabilirsiniz.

https://github.com/Bahadireray/jetpackComposeFileUpload

--

--