• AppTractor.ru
  • Главная
  • iTunes
  • SoundCloud
  • Podster
  • Чат в Telegram
Подкасты Android Dev
Подкасты Android Dev
  • AppTractor.ru
  • Главная
  • iTunes
  • SoundCloud
  • Podster
  • Чат в Telegram
Начинаем работать с Firebase Cloud Storage на Android

Начинаем работать с Firebase Cloud Storage на Android

Работа с облачным хранилищем может быть очень трудной, особенно если вы не знаете, что делать. К счастью, Firebase упрощает ее до такой простой степени, насколько это возможно. В этой статье мы обсудим, почему вам нужно использовать Firebase Cloud Storage вместо других облачных сервисов хранения, а также покажем разные способы работы с ним.

Как и в других моих туториалах, это будет очень упрощенная версия использования Firebase Cloud Storage. Для более подробного руководства ознакомьтесь с официальными документами.

Предпосылки

Прежде чем вы сможете использовать Firebase Cloud Storage, вам необходимо установить Firebase SDK. Посмотрите, как это сделать за пару минут с помощью Помощника по Firebase.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

Вам также нужно будет зайти в консоль, настроить там новый проект, если вы этого еще не сделали (или сделайте это при подключении своего приложения к Firebase с помощью помощника), а также инициализировать Cloud Storage. По умолчанию правила безопасности разрешают доступ только аутентифицированным пользователям, но если вы измените их, это позволит всем пользователям получать доступ к хранилищу (не забудьте впоследствии это исправить).

Зачем использовать Firebase Cloud Storage?

Надежные операции

Большие операции загрузки и скачивания могут занять некоторое время, особенно для пользователей с плохим интернет-соединением. Если сетевое соединение обрывается на середине операции, операция будет продолжена там, где она была остановлена ​​ранее.

Усиленная безопасность

Вы можете настроить правила безопасности только для того, чтобы операции выполнялись только при определенных условиях, которые вы также можете интегрировать с Firebase Authentication.

Высокая масштабируемость

Когда ваше приложение начнет проходить стадию вирусного роста в нем будет все больше действий, ваше хранилище сможет легко масштабироваться, чтобы работать со все возрастающей аудиторией… с небольшим вливанием денег, конечно. Вы не сможете получить все бесплатно.

Интеграция облачного хранилища в ваше приложение

Чтобы использовать Firebase Cloud Storage, вам нужно будет получить инстанс Firebase Storage, получить ссылку, указывающую на местоположение корзины в онлайн-хранилище, а затем со всем этим вы сможете выполнять операции загрузки и скачивания.

compile 'com.google.firebase:firebase-storage:11.8.0'

Во-первых, добавьте эту зависимость в свой build.gradle file.

Получение нашей ссылки

Сначала получите образец Firebase Storage.

FirebaseStorage storage = FirebaseStorage.getInstance();

Затем, как и в базе данных или Firestore, мы получим ссылку на корневую папку нашего хранилища.

StorageReference rootRef = storage.getReference();

Тогда, как и в Realtime Database, вы можете пойти ниже по дереву с помощью

StorageReference myRef = rootRef.child("images/myimagedirectory")

Дополнительная навигация

Как и в случае с базами данных, у вас есть методы  getParent и getRoot для навигации.

Загрузка файлов в хранилище

До сих пор мы рассматривали ссылки на каталоги. Однако с хранилищем, в отличие от баз данных Firebase, ссылки могут указывать на местоположение файла . Я покажу вам, что имею в виду.

StorageReference mountainsRef = storageRef.child("mountains.jpg");

Когда мы загружаем файл по этой ссылке, то независимо от исходного имени файла, он загружается в облачное хранилище как images/myimagedirectory/mountains.jpg. Если мы загрузим другой файл по этой же ссылке, то новый файл переопределит (override) ранее загруженный файл.

Теперь, когда у нас есть ссылка на файл, мы рассмотрим различные способы загрузки файла в эту ссылку.

putBytes ()

Этот метод является самым простым способом загрузки файла и возвращает UploadTask, который вы можете использовать для управления и контроля состояния загрузки.

// Get the data from an ImageView as bytes
imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap = imageView.getDrawingCache();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();
 
UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
        Uri downloadUrl = taskSnapshot.getDownloadUrl();
    }
});

В этом примере мы получили данные из ImageView в виде byte[] и добавили success и failure listeners к UploadTask для правильной обработки операции при ее завершении.

Недостатком функции putBytes () является интенсивный расход памяти, так как приложение требует одновременного хранения всего содержимого вашего файла в памяти. Другие 2 метода, которые мы рассмотрим здесь, лучше, если вы хотите использовать меньше памяти.

putStream()

Это самый универсальный способ загрузки в облачное хранилище. Он принимает InputStream и снова возвращает UploadTask.

InputStream stream = new FileInputStream(new File("path/to/images/rivers.jpg"));
 
uploadTask = mountainsRef.putStream(stream);
uploadTask.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
        Uri downloadUrl = taskSnapshot.getDownloadUrl();
    }
});

В этом примере мы получаем FileInputStream из каталога в нашем локальном хранилище телефона и передаем его в putStream, чтобы получить UploadTask.

putFile()

Этот метод принимает Uri файла и снова возвращает UploadTask.

Uri file = Uri.fromFile(new File("path/to/images/rivers.jpg"));
StorageReference riversRef = storageRef.child("images/"+file.getLastPathSegment());
uploadTask = riversRef.putFile(file);
 
// Register observers to listen for when the download is done or if it fails
uploadTask.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
        Uri downloadUrl = taskSnapshot.getDownloadUrl();
    }
});

В этом примере мы получаем Uri из файла в нашем локальном хранилище, и передаем его в putFile, чтобы получить UploadTask.

Загрузка файлов из вашего хранилища

Как и при закачке, вы начинаете с получения ссылки на файл, который хотите загрузить. Как только вы получили ее, вы можете использовать один из двух методов: они похожи на те, которые используются для закачки.

getBytes()

Это самый простой способ загрузки файлов. Однако у него есть несколько недостатков. Он более напряженный для памяти, и если вы запрашиваете файл, занимающий больше места, чем доступно памяти вашего приложения, ваше приложение будет аварийно завершено.

StorageReference islandRef = storageRef.child("images/island.jpg");
 
final long ONE_MEGABYTE = 1024 * 1024;
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Data for "images/island.jpg" is returns, use this as needed
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

Чтобы этого не произошло, мы передаем максимальное количество байт, которые мы хотим загрузить в getBytes. Установите этот максимум на то число, которое, как вы знаете, может обрабатывать ваше приложение или используйте другой способ загрузки.

getFile()

Этот метод загружает файл непосредственно в локальное хранилище вашего устройства. Это означает, что после этого файл может быть доступен в автономном режиме или использоваться в других приложениях.

islandRef = storageRef.child("images/island.jpg");
 
File localFile = File.createTempFile("images", "jpg");
 
islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
        // Local temp file has been created
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

Если вам интересно, метода getStream не существует. Однако существует метод getDownloadUrl, который снова возвращает DownloadTask, который вы можете использовать, если у вас есть собственная инфраструктура загрузки или вы просто хотите поделиться URL-адресом загрузки.

Обработка ошибок

Существует много ошибок, которые могут возникнуть во время загрузки, например, файл не существует или у пользователя нет разрешения на доступ к этому файлу. Обязательно обработайте эти ошибки соответствующим образом в своем OnFailureListener в DownloadTask.

Получить пример исходного кода приложения

Как и в других моих туториалах, я подготовил для вас пример приложения. Это приложение использует putBytes и getBytes для загрузки и скачивания с помощью выбора изображений медведя.

 

Facebook Twitter Google+ LinkedIn VKontakte

Facebook Comments

Другие записи

Трудоустройство Android-разработчиков в России и за рубежом: собеседования, знания, деньги — часть 1.1 Статья
18/06/2018

Трудоустройство Android-разработчиков в России и за рубежом: собеседования, знания, деньги — часть 1.1

38 лучших Open Source Android-проектов на Java Статья
13/04/2018

38 лучших Open Source Android-проектов на Java

Соединяем Android Things со смартфоном при помощи Nearby Connections 2.0 Статья
23/03/2018

Соединяем Android Things со смартфоном при помощи Nearby Connections 2.0

Слушайте
itunes-podcast-app-logo soundcloud-icon thumb17
Подпишитесь на рассылку Дайджест интересных материалов для разработчиков
Facebook
Apptractor

  • AppTractor.ru
  • Главная
  • Обратная связь
  • О проекте
  • RSS
  • Back to top
Android Dev — подкаст о разработке под Android и всем, что с этим связано. Гости программы — разработчики с большим опытом и стажем, которые помнят Android, когда он еще был версии 1.5, и за годы написали приложения для миллионов пользователей по всему миру.
Последние записи
Интересные материалы для Android-разработчика #256

Интересные материалы для Android-разработчика #256

Интересные материалы для Android-разработчика #255

Интересные материалы для Android-разработчика #255

Метки
Android Android O Android Pay Android Things ConstraintLayout Continuous Delivery Continuous Integration Dagger Droidcon Firebase Flutter Google Assistant Google I/O Gradle I/O Instant apps Java Jrebel Kotlin Mobius NDK open source React Native RXJava TensorFlow анимация архитектура аудио безопасность видео дайджест дизайн дополненная реальность интернет вещей исходный код конференция кроссплатформенная разработка машинное обучение новости обучение программирование работа разработка статья тестирование
© AppTractor.ru 2019