Sebagai Android Developer sering kali kita bekerja dengan File. Misalnya, ketika kita mengembangkan sebuah aplikasi yang memungkinkan user untuk memilih gambar dan memperbarui foto profil mereka. Ketika user aplikasi memilih sebuah file gambar, biasanya kita mendapatkan object Uri sebagai hasil balik pilihan pengguna.
Setelah mendapatkan Object Uri, selanjutnya kita proses object tersebut menjadi object File guna mendapatkan absolute path dan di gunakan informasi ketika mengunggah file ke server.
```kt
File.getAbsolutePath()
```
Pada step ini mungkin kita mendapati sebuah error biasanya karena belum mendapat izin permission READ_EXTERNAL_STORAGE atau bahkan absolute path yang digunakan untuk keperluan upload ke server salah. Belum lagi bagaimana jika user memilih file dari penyimpanan cloud seperti Google Drive?
```kt
// contoh absolute path
// /storage/emulated/0/Android/Pictures/myImage.jpg
```
Pada artikel ini saya akan menunjukan bagaimana mendapatkan absolute path asli tanpa permission, bahkan ini bekerja jika pengguna memilih file dari penyimpanan cloud seperti Google Drive dan kompatibel dengan versi android terbaru.
Cara mendapatkan absolute path
```kt
private val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
val uri: Uri = result.data?.data ?: return
}
}
```
Pada kode di atas, saya menggunakan registerForActivityResult dan StartActivityForResult, ini digunakan untuk menerima hasil balik file pilihan pengguna. Dan di dalamnya kita bisa mendapatkan object Uri sebagai representasi file pilihan pengguna.
Setelah mendapatkan object Uri, selanjutnya kita akan mendapatkan object FileInputStream melalui object FileDescriptor dengan meneruskan object Uri tersebut ke openFileDescriptor function.
FileDescriptor digunakan untuk membuat object FileInputStream dengan meneruskan FileDescriptor sebagai constructor.
```kt
val fileDescriptor: FileDescriptor = contentResolver.openFileDescriptor(uri, "r")?.fileDescriptor
val inputStream = FileInputStream(fileDescriptor)
```
Sekarang Anda sudah mendapatkan FileInputStream, selanjutnya tentukan lokasi penyimpanan file dan nama file. Gunakan file tersebut untuk membuat FileOutputStream. Pada kasus ini kita akan simpan filenya di external specific directory dan akan kita beri nama file “myImage.jpg”.
```kt
val fileName = "myImage.jpg"
val primaryStorage: File = ContextCompat.getExternalFilesDirs(this, null)[0]
val outputFile: File = File(primaryStorage, fileName)
val outputStream = FileOutputStream(outputFile)
```
Jika Anda perhatikan lagi kita sudah mendapatkan FileInputStream dan FileOutputStream yang di simpan ke variabel inputStream dan ouputStream. Sekarang kita akan gunakan FileInputStream untuk di copy atau di salin ke FileOutputStream menggunakan extension function use yang sudah di sediakan oleh kotlin.
```kt
inputStream.use { input ->
outputStream.use { output ->
input.copyTo(output)
}
}
val absoluthPath = outputFile.absolutePath
// /storage/emulated/0/Android/data/com.example.myPicker/files/myImage.jpg
```
Thats it, sekarang Anda sudah bisa mendapatkan absolute path, bahkan jika pengguna memilih file dari google drive dan kompatibel dengan versi android terbaru.
Semoga artikel dapat membantu Anda lebih memahami ketika bekerja file di Android. Anda dapat bereksplorasi ketika bekerja dengan file, Android menawarkan berbagai macam api yang memudahkan untuk bekerja dengan file. Contohnya alih alih menggunakan openFileDescriptor, Anda bisa menggunakan openAssetFileDescriptor.
Untuk kebutuhan pengembangan mobile apps, atau perbaikan mobile apps yang perusahaan anda miliki, kontak kami disini. Kami tunggu!
Author : Eka Bayu – Android Development Crocodic