Bài viết này mình sẽ sử dụng Firebase như một server lưu trữ dữ và cung cấp dữ liệu cho ứng dụng Android. Mình sẽ xây dụng 1 ứng dụng Android đơn giản cho phép người dùng lưu thông tin sản phẩm gồm Tên, Giá, Hình Ảnh trên Firebase và tải nó về hiển thị ở 1 giao diện khác. GIống như các ứng dụng rao bán khác, nhưng mình chỉ giới hạn ở mức Post 1 sản phẩm và load danh sản phẩm.
Chỉ 2 giao diện chính:
Đăng tin:
Hình ảnh, tên và giá. Nhấn upload để lưu dữ liệu trên Firebase.
Hiên thị:
Danh sách sản phẩm được lấy từ database Firebase.
Để làm được điều đó bạn cần đến 2 chức năng chính của Firebase.
Firebase Storage và Realtime Database.
Firebase Storage:
Firebase Storage là dịch vụ được xây dựng cho mục đích lưu trữ và quản lý các nội dung mà người dùng ứng dụng tạo ra như ảnh, videos hay dữ liệu dạng file.
Firebase Storage cung cấp các API cho việc uploads và download các file từ app của bạn một cách bảo mật và bạn không cần quan tâm đến chất lượng đường truyền mạng.
Firebase Storage được xây dựng trên nền tảng Google Cloud Platform nên có nhiều lợi thế.
Một số điểm mạnh:
- Robust : Firebase Storage thực hiện việc upload và download không phụ thuộc vào chất lượng đường truyền mạng hơn nữa các quá trình đó có thể bắt đầu lại khi bị tạm dừng giúp tiết kiệm thời gian và băng thông.
- Secure: Được tích hợp Firebase Authentication cho việc bảo mật nên dễ dàng quản lý quyền truy cập vào các files.
- Scalable : Firebase Storage được xây dựng trên nền tảng Google Cloud Platform nên khả năng mở rộng có thể lên đến hàng Petabyte dữ liệu.
Realtime Database:
Firebase lưu trữ dữ liệu database dưới dạng JSON và thực hiện đồng bộ database tới tất cả các client theo thời gian thực. Cụ thể hơn là bạn có thể xây dựng được client đa nền tảng (cross-platform client) và tất cả các client này sẽ cùng sử dụng chung 1 database đến từ Firebase và có thể tự động cập nhật mỗi khi dữ liệu trong database được thêm mới hoặc sửa đổi.
Ngoài ra Firebase còn cho phép bạn phân quyền một các đơn giản bằng cú pháp tương tự như javascript.
Bắt đầu với việc tạo Project Firebase:
- Truy cập trang firebase.google.com
- Nhấn vào nút Get Started ở trang chủ
- Login với tài khoản Google
- Nhấn nút Add Project
- Nhập tên project và quốc gia mà bạn muốn lưu Database sau nó nhấn Create Project
- Nhấn vào biểu tượng Add firebase to your android app
- Tạo Project mới trên Android Studio
- Điền các thông tin Package Name, App Nick Name, SHA-1 certificate Bạn có thể xem hướng dẫn cách lấy SHA-1
- Nhấn nút Register App
- Nhấn nút Download google-services.json
- Copy file google-services.json bạn vừa tải và dán vào thư mục app
- Mở project của bạn trên Android Studio, vào thư mục build.gradle(project)
- Thêm dòng classpath ‘com.google.gms:google-services:3.0.0’ vào dependencies
- Vào file build.gradle (app) thêm các dòng sau vào dependencies
compile 'com.google.firebase:firebase-storage:10.0.1' compile 'com.google.firebase:firebase-auth:10.0.1' compile 'com.firebase:firebase-client-android:2.4.0' compile 'com.google.firebase:firebase-database:10.0.1'
Thêm apply plugin: ‘com.google.gms.google-services’ vào đầu file
Thêm bên dưới build type
packagingOptions{ exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE-FIREBASE.txt' exclude 'META-INF/NOTICE' }
File build.gradle của bạn sẽ trông như thế này:
- Quay lại project Firebase, mục Database và cấu hình Rules giống như thế này
read:true, write: true là bạn cho phép lấy dữ liệu và thêm dữ liệu vào Firebase
- Tiếp tục vào mục Storage, chọn Rules cấu hình như hình dưới
Cho phép bạn đọc và ghi dữ liệu mà không cần auth, Ở đây mình không cần login. Nếu ứng dụng của bạn cần login, bạn phải sửa lại thành “ request.auth != null ”
Project Android Studio
1. Permission:
Bạn cần quyền truy cập internet
<uses-permission android:name="android.permission.INTERNET" />
2. Thư viện hổ trợ:
compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.android.support:cardview-v7:26.0.+' compile 'com.android.support:recyclerview-v7:26.0.+'
Picasso thư viện load hình ảnh tử url.
Cardview hỗ trợ đổ bóng, bo góc các view. Giúp view nổi bật và đẹp hơn
Recycleview, mình thích dùng thằng này để hiển thị danh sách hơn listview. Cảm giác mượt hơn và tùy chỉnh nhiều cột dễ hơn.
3. Reference
Firebase Storage sử dụng các Reference để chỉ đến một bucket hoặc một file, bạn có thể làm bất cứ thứ gì với bucket, files thông qua Reference đó như upload, download hay thay đổi metadata hoặc xóa file. Reference mang tính chất lightweight vì vậy bạn có thể sử dụng nó bao nhiêu tùy thích hoặc có thể sử dụng lại một Reference cho nhiều hành động khác nhau.
Tạo Reference
StorageReference storageReference = FirebaseStorage.getInstance().getReference("image_product/"); DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference(“product”);
Mình cần thao tác với database và store nên mình tạo tao 2 cái reference như trên. với cấu getReference(“product”), Firebase sẽ tạo ra cho mình 1 folder là product. Những thao tác upload, dowload tiếp theo của mình với databaseReference chỉ diễn ra với thư mục product.
- UploadFile
storageReference.putFile(FilePathUri)
Hàm bạn override hàm .addOnSuccessListener để biết khi nào upload thành công và xử lý bước tiếp theo
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // Hiding the progressDialog after done uploading. progressDialog.dismiss(); @SuppressWarnings("VisibleForTests") String urlProduct = taskSnapshot.getDownloadUrl().toString(); String name = edtName.getText().toString(); int price = Integer.parseInt(edtPrice.getText().toString()); Products products = new Products(1,name,urlProduct,price); databaseReference.push().setValue(products); Intent intent = new Intent(MainActivity.this,ListProduct.class); startActivity(intent); } })
taskSnapshot.getDownloadUrl().toString(); cho phép bạn lấy link của file vừa upload thành công
Sao đó mình upload product lên database bằngdatabaseReference.push().setValue(products);
Load list product từ database
databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot data: dataSnapshot.getChildren()){ Products child = data.getValue(Products.class); productsList.add(new Products(child.getId(),child.getName(),child.getUrl(),child.getPrice())); loadData(); } } @Override public void onCancelled(DatabaseError databaseError) { } });
Hàm onDataChange sẽ trả về dataSnapshot dạng Json.
DataSnapshot { key = product, value = { -L4FhO9IjU0VDHj5vr89={ name=phòng 02, id=1, price=80000, url=https: //firebasestorage.googleapis.com/v0/b/demopushnotification-90f5a.appspot.com/o/image_product%2F1517477529592.png?alt=media&token=35e750d0-56eb-490e-8cb8-c5f1ce769702 }, -L4FhHZ6ycB1YkwBybl1={ name=phòng 01, id=1, price=90000, url=https: //firebasestorage.googleapis.com/v0/b/demopushnotification-90f5a.appspot.com/o/image_product%2F1517477502726.jpg?alt=media&token=414302e6-4261-432d-9767-342b972ac5cd } } }
Bạn sẽ parse dữ liệu và hiển thị nó trên RecycleView
Các bạn có thể download project mẫu của mình để có thể tham khảo
Link: https://drive.google.com/file/d/1Q2rU9S6vHZcoy-jiegNxQHNTOZFdS7kh