How to file upload Jetpack Compose Android?
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.
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.- 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ğertrue
ise, izin verilmiş demektir. Eğerfalse
ise, izin verilmemiş demektir. - Eğer izin verilmişse,
Toast.makeText()
fonksiyonu ile kullanıcıya "Permission granted" (İzin verildi) mesajını gösterir veopenFilePicker()
fonksiyonunu çağırarak dosya seçiciyi açar. - 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")
}
}
}
FilePickerScreen
adında bir Composable fonksiyon tanımlar.permissionGranted
adında birmutableStateOf
değişkeni oluşturur. Bu değişken, dosya seçme izni verildiğinde veya reddedildiğinde durumu tutar.Column
bileşeni içinde bir düğme (button) yer alır. Bu düğme, "Select File" metni ile görüntülenir.- Düğmenin tıklanma (onClick) işlemi tanımlanır. Tıklama işlemi, dosya seçme izni kontrolüne dayanır.
checkPermission
fonksiyonu kullanarak dosya okuma izni kontrol edilir. Eğer izin verilmişse,permissionGranted
değişkenitrue
olarak ayarlanır veopenFilePicker()
fonksiyonu çağrılarak dosya seçici açılır.- 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
}
}
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 haldefalse
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.