Firebase Untuk Android: Penyimpanan File
Indonesian (Bahasa Indonesia) translation by Yanti Baddolo (you can also view the original English article)
Selama konferensi Google I / O 2016, Firebase diperkenalkan kembali ke komunitas pengembang sebagai alat utama untuk menyediakan dukungan back-end cepat untuk halaman web dan aplikasi mobile. Tutorial ini akan memperkenalkan Anda ke fungsi penyimpanan dan pengambilan file yang tersedia untuk aplikasi Android Anda.
Untuk belajar lebih banyak mengenai database waktu nyata dari Firebase, Analisis, autentifikasi dan pelaporan kecelakaan, silahkan mengunjungi beberapa Tutorial Lainnya di Envato Tuts+.
Setup Otentikasi
Singkatnya, kami akan melewatkan proses penyiapan umum untuk Firebase di aplikasi Android dan konsol Firebase Anda. Jika ini adalah pertama kalinya Anda mencoba Firebase di aplikasi, sebaiknya periksa dulu artikel Memulai Firebase untuk Android dari Ashraff Hathi belagal.
Sebelum Anda dapat mulai menggunakan Penyimpanan Firebase, Anda harus memastikan pengguna Anda diautentikasi, atau mengubah persyaratan persyaratan otentikasi di Konsol Firebase untuk mengizinkan pengguna yang tidak berkepentingan untuk mengakses dan mengunggah file. Untuk menjaga hal-hal sederhana, kita akan melakukan yang terakhir. Mari kita mulai dengan pergi ke bagian Penyimpanan Firebase dengan memilih Penyimpanan di kolom navigasi sebelah kiri.



Selanjutnya, Anda akan menyadari bahwa terdapat dua tab pada bagian atas layar penyimpanan: file dan Aturan.



Pilih tab Rules tab, lalu pada baris allow read, write: if request.auth != null
;, ubahlah !=
ke ==
dan klik tombol PUBLISH.



Sekarang setiap pengguna aplikasi Anda harus dapat mengunggah atau mendownload file dari back-end Firebase Anda. Meskipun hal ini tidak ideal untuk lingkungan produksi, ini akan membuat pembelajaran tentang Penyimpanan Firebase jauh lebih mudah tanpa harus menggali kode otentikasi.
Upload file secara manual
Sementara bisa mengunggah file dari sebuah aplikasi sangatlah hebat, terkadang Anda hanya ingin menyimpan file di suatu tempat yang mudah diakses dan ditarik ke aplikasi Anda. Di sinilah Anda bisa mengunggah file dari Konsentra Firebase secara manual. Di bawah tab File, Anda akan melihat tombol biru berjudul Upload File.



Klik itu dan pilih file yang ingin Anda upload, dan akan muncul di Penyimpanan Firebase Anda..



Memilih file di konsol akan memunculkan tampilan detail, memungkinkan Anda memeriksa file yang sebelumnya telah diunggah.



Mengunduh File dari Aplikasi Android
Sekarang setelah Anda memiliki file yang tersimpan di Firebase, mari maju dan tariklah kedalam aplikasi. Kita akan menggunakan layout sederhana di MainActivity
kita yang berisi ImageView
dengan id
.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
Untuk mengakses file Storage Firebase Anda, Anda harus terlebih dahulu mendapatkan referensi ke file objek FirebaseStorage
, lalu membuat StorageReference
ke URL proyek dan file yang ingin Anda download. Anda dapat menemukan URL proyek Anda di bagian atas File dari Penyimpanan di Konsol Firebase.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageRef = storage.getReferenceFromUrl("gs://tutsplus-firebase.appspot.com").child("android.jpg");
Selanjutnya, Anda bisa membuat objek File
dan mencoba untuk memuat file yang Anda inginkan dengan menelepon getFile
pada StorageReference
Anda dengan objek File
yang baru sebagai parameter. Karena operasi ini terjadi secara asinkron, Anda bisa menambahkan OnSuccessListener
dan OnFailureListener
pada panggilan Anda untuk menangani kontingensi.
try { final File localFile = File.createTempFile("images", "jpg"); storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { Bitmap bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath()); mImageView.setImageBitmap(bitmap); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { } }); } catch (IOException e ) {}
Pada onSuccess()
dari OnSuccessListener
, Anda dapat mengambil objek FileDownloadTask.TaskSnapshot
dan mengambil file, yang akan kita atur gambarnya kedalam ImageView
.



Mengunduh File sebagai Byte Array
Jika Anda hanya perlu mengunduh file sebagai byte[]
dan tidak membutuhkannya sebagai file, yang merupakan kasus yang lebih mungkin terjadi saat memuat gambar menjadi ImageView
, maka anda dapat mengambil byte dengan cara yang sama.
final long ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() { @Override public void onSuccess(byte[] bytes) { Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); mImageView.setImageBitmap(bitmap); } });
Mendapatkan URL File
Mungkin ada situasi di mana Anda tidak memerlukan data aktual untuk file tersimpan, namun menginginkan URL tersebut. Anda bisa melakukan ini dengan cara yang sama seperti dua contoh terakhir dengan menggunakan metode getDownloadUrl ()
di StorageReference
blog anda, yang akan memberi Anda Uri
yang menunjuk ke lokasi file.
storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { Log.e("Tuts+", "uri: " + uri.toString()); //Handle whatever you're going to do with the URL here } });
Metode di atas akan mencetak URL untuk gambar yang kami unggah secara manual sebelumnya di Android Monitor.
E/Tuts+: uri: https://firebasestorage.googleapis.com/v0/b/tutsplus-firebase.appspot.com/o/android.jpg?alt=media&token=1828111c-78e7-4640-b418-c65e7571576a
Mengunggah Dari Apl Android
Sekarang setelah Anda tahu cara mendownload file dari Firebase, saatnya untuk mengerjakan unggahan. Seperti yang Anda lihat, saat mendownload dari Penyimpanan Firebase, proses untuk setiap bentuk data Anda cukup mirip. Mengunggah tidak berbeda, jadi kami hanya bisa masuk ke bagaimana Anda bisa memindahkan file dari aplikasi Anda ke dalam Penyimpanan Firebase.
Mengunggah Array Byte
Seperti mengunduh, Anda perlu referensi ke objek FirebaseStorage
dan membuat referensi ke lokasi penyimpanan file baru Anda sebagai StorageReference
. Untuk contoh ini, kami akan menunjukkan ic_launcher.png di ImageView
, lalu kita mengunggahnya seperti array byte.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://tutsplus-firebase.appspot.com").child("ic_launcher.png");
Selanjutnya kita akan mendapatkan byte array dari gambar yang tersimpan di memori melalui ImageView
. Ini dilakukan dengan memanggilnya sebagai sebuah Bitmap
, menekannya menjadi ByteArrayOutputStream
, dan mengubahnya kedalam byte[].
mImageView.setDrawingCacheEnabled(true); mImageView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); mImageView.layout(0, 0, mImageView.getMeasuredWidth(), mImageView.getMeasuredHeight()); mImageView.buildDrawingCache(); Bitmap bitmap = Bitmap.createBitmap(mImageView.getDrawingCache()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); byte[] data = outputStream.toByteArray();
Akhirnya, Anda dapat membuat UploadTask
dengan memanggil putBytes(byte[])
untuk mengunggah gambar Anda ke Firebase. UploadTask
juga bisa mendapatkan OnSuccessListener
dan OnFailureListener
yang diasosiasikan dengannya.
UploadTask uploadTask = storageReference.putBytes(data); uploadTask.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { } });
Ketika Anda mengecek halaman penyimpanan konsol Firebase, Anda seharusnya dapat melihat ic_launcher.png di daftar file Anda.



Mengunggah dari InputStream
atau File
Sekarang setelah Anda tahu cara mengunggah array byte, dua jenis unggahan lainnya harus cukup intuitif. Katakanlah kita memiliki sebuah file teks bernama test.txt di folder sumber mentah. Kita bisa membaca ini menjadi sebuah InputStream
dan kemudian mengunggahnya dengan menggunakan metode putStream (InputStream)
dari StorageReference
.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://tutsplus-firebase.appspot.com").child("test.txt"); InputStream stream = getResources().openRawResource(R.raw.test); UploadTask uploadTask = storageReference.putStream(stream);



Mengunggah file yang sudah ada sebenarnya mude: cukup dapatkan referensi file dan panggil putFile(Uri)
denganURI yang menunjuk ke file Anda. Untuk contoh ini, kita akan membuat file sementara dalam kode kita.
FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://tutsplus-firebase.appspot.com").child("test2.txt"); File file = null; try { file = File.createTempFile("test2", "txt"); } catch( IOException e ) { } UploadTask uploadTask = storageReference.putFile(Uri.fromFile(file));



Mengontrol Unggahan dan Menggunakan Callbacks
Selama file yang sudah kita unggah sejauh ini masih tergolong kecil, pasti ada saatnya dimana Anda memiliki file lebih besar untuk diunggah yang membutuhkan lebih banyak waktu. Firebase menyediakan beberapa metode dengan UploadTask
yang mengijinkan Anda mengontrol arus unggahan dan mendengarkan kemajuan dan perubahan keadaan. Metode ini termasuk pause()
, resume()
, dan cancel()
. pause()
dan resume()
akan membiarkan Anda berhenti sebentar dan melanjutkan UploadTask
, sementara cancel()
akan benar-benar menghentikannya. Selain itu, Anda dapat menggunakan OnPauseListener
dan OnProgressListener
untuk melacak kemajuan unggahan dan keadaan jeda.
mPause = (Button) findViewById(R.id.pause); mResume = (Button) findViewById(R.id.resume); mPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mUploadTask.pause(); } }); mResume.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mUploadTask.resume(); } }); FirebaseStorage storage = FirebaseStorage.getInstance(); StorageReference storageReference = storage.getReferenceFromUrl("gs://tutsplus-firebase.appspot.com").child("image.jpg"); InputStream stream = getResources().openRawResource(R.raw.image); mUploadTask = storageReference.putStream(stream); mUploadTask.addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() { @Override public void onPaused(UploadTask.TaskSnapshot taskSnapshot) { Log.e("Tuts+", "upload paused!"); } }); mUploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { @Override public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { Log.e("Tuts+", "Bytes uploaded: " + taskSnapshot.getBytesTransferred()); } });
Kode diatas akan mengijinkan Anda mengontrol proses mengunggah untuk gambar yang cukup besar (1MB, misalnya) dan melihat perubahan keadaannya di Log Android ketika tombol pause dan resume ditekan.
E/Tuts+: Bytes uploaded: 524288 E/Tuts+: upload paused! E/Tuts+: Bytes uploaded: 786432
Menangani Siklus Hidup Aktivitas Android
Seperti yang dapat diketahui oleh pengembang Android, terkadang rangkaian aktivitas Android dapat menyebabkan masalah tak terduga. Salah satu sumber masalah yang umum adalah pendengar yang bertahan lebih lama dari Aktivitas
orang tua mereka, yang mungkin menjadi kasus pada keberhasilan / kegagalan pendengar yang melekat pada tugas penyimpanan Firebase.
Jika Aktivitas
hancur dan diciptakan kembali (seperti pada rotasi layar) saat sebuah tugas sedang terjadi, Anda mungkin akan berakhir dengan NullPointerException
saat tugas selesai. Untuk menghindarinya, Anda pasti ingin menyimpan StorageReference
Anda sebagai String
dalam keadaan luar Bundle
Anda dalam metode onSaveInstanceState (Bundle)
, dan kemudian mengambilnya dan menambahkan pendengar yang sukses ke masing masing FileDownloadTask
atau FileUploadTask
yang terkait dengan StorageReference
.
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mStorageReference != null) { outState.putString(EXTRA_STORAGE_REFERENCE_KEY, mStorageReference.toString()); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); final String stringRef = savedInstanceState.getString(EXTRA_STORAGE_REFERENCE_KEY); if (stringRef == null) { return; } mStorageReference = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef); List<FileDownloadTask> tasks = mStorageReference.getActiveDownloadTasks(); for( FileDownloadTask task : tasks ) { task.addOnSuccessListener(this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { Log.e("Tuts+", "download successful!"); } }); } }
Kesimpulan
Dalam tutorial ini Anda telah belajar banyak tentang Firebase dan pilihan yang tersedia untuk penyimpanan file. Seharusnya Anda sekarang dapat mengunggah dan mengunduh file, mengontrol transfer data, dan menangani perubahan dalam siklus aktivitas aplikasi Anda saat terjadi transaksi.
Meskipun kami baru saja menggaruk permukaan dari apa yang dapat Anda lakukan di Firebase, memahami alat ini semoga memungkinkan Anda untuk memperluas kemampuan aplikasi Anda sendiri dan memberikan pengalaman hebat bagi pengguna Anda.
Dan sementara itu, lihat beberapa artikel kami yang lain tentang pengembangan Android!