Прежде всего, я новичок в Firebase:)
Я не смог найти учебник или пример, показывающий, как создать автономное первое мобильное приложение с Firebase Storage и Firebase Firestore. Я использую Firestore, чтобы сохранить данные об элементах: идентификатор, имя, изображение. Я использую Хранение, чтобы сохранить изображения и связать эти изображения с элементами из Firestore. Когда телефон подключен к inte rnet, все отлично, но я не уверен, как лучше всего добавить элемент, когда устройство не подключено.
Единственное хорошее решение, о котором я мог подумать:
- Установите для изображения элемента значение локального URL-адреса файла, чтобы изображение могло отображаться в представлении моего переработчика.
- Запуск загрузки элемента и изображения одновременно.
- Сохранение изображения
sessionUri
и локальный путь к файлу, чтобы задача могла быть возобновлена позже. - Обнаружение изменения подключения и возобновление задач с изображениями, если они есть.
- Когда загрузка изображения завершена, получите URL-адрес загрузки и обновите элемент в Firestore. Затем очистите задачу сохраненного образа.
Я действительно ожидал, что клиентская библиотека Firebase сможет обработать такой тривиальный вариант использования из коробки.
MCVE:
public void addImageOnClick(final View view) {
final Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 123);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == 123) {
save("id1", "name1", intent.getData());
}
}
private void save(final String id, final String name, final Uri imageUri) {
final Map<String, Object> item = new HashMap<>();
item.put("id", id);
item.put("name", name);
FirebaseStorage.getInstance()
.getReference("items")
.child(id)
.putFile(imageUri)
.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(final Task<UploadTask.TaskSnapshot> task) throws Exception {
return task.getResult()
.getMetadata()
.getReference()
.getDownloadUrl();
}
})
.continueWith(new Continuation<Uri, Void>() {
@Override
public Void then(final Task<Uri> task) throws Exception {
item.put("image", task.getResult().toString());
FirebaseFirestore.getInstance()
.collection("items")
.document(id)
.set(item);
return null;
}
})
.continueWith(new Continuation<Void, Void>() {
@Override
public Void then(final Task<Void> task) throws Exception {
Toast.makeText(MainActivity.this, String.valueOf(task.isSuccessful()), Toast.LENGTH_LONG).show();
return null;
}
});
}