Android:如何在 Firebase Storage 上上传图片?


什么是 Firebase Storage?

Firebase 是 Google 著名的云平台服务提供商之一,它为 Android、IOS 和 Web 应用程序提供数据库、存储、托管和其他云服务。在本文中,我们将特别关注 Firebase Storage,以及如何使用它将图片从 Android 设备上传到 Firebase Storage。

Firebase Storage 的实现

我们将创建一个简单的 Android 应用程序,其中我们将显示两个按钮和一个图像视图。我们将使用一个按钮来选择图片,另一个按钮将图片上传到我们的 Firebase Storage。我们还将使用一个图像视图来显示用户从设备中选择的图片。我们将遵循分步指南,使用 Kotlin 在我们的 Android 应用程序中实现 Firebase Storage。

步骤 1:在 Android Studio 中创建一个新项目

导航到 Android Studio 并点击“新建项目”。

点击“新建项目”后,您将看到以下屏幕。

在这个屏幕中,我们只需选择“Empty Activity”并点击“Next”。点击“Next”后,您将看到以下屏幕。

在这个屏幕中,我们只需指定项目名称。然后包名称将自动生成。

注意 - 请确保选择 Kotlin 作为语言。

指定所有详细信息后,点击“Finish”以创建一个新的 Android Studio 项目。

项目创建后,我们将看到打开的两个文件:activity_main.xml 和 MainActivity.kt 文件。

步骤 2:将您的项目连接到 Firebase Storage

项目创建后。在 Android Studio 工具栏顶部出现的 Android Studio 中导航到“Tools”选项卡。在其中点击 Firebase > 然后点击 Firebase Storage,您将看到以下屏幕。

之后,您只需点击“Connect to Firebase”将您的应用程序连接到 Firebase。然后,您必须点击“Add cloud Storage to Firebase”以向其添加 Firebase Storage 依赖项。点击这两个按钮后,您将看到以下屏幕。

现在我们的应用程序已连接到 Firebase Storage。

步骤 3:使用 activity_main.xml

导航到 activity_main.xml。如果此文件不可见,要打开此文件,请在左侧面板中导航到 app > res > layout > activity_main.xml 以打开此文件。打开此文件后,将以下代码添加到其中。代码中添加了注释以便详细了解。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <!-- creating text view for displaying heading-->
   <TextView
      android:id="@+id/idTVHeading"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_margin="20dp"
      android:gravity="center"
      android:text="Firebase Storage in Android"
      android:textAlignment="center"
      android:textAllCaps="false"
      android:textColor="#FF000000"
      android:textSize="20sp"
      android:textStyle="bold" />

   <!-- creating an image view for displaying image-->
   <ImageView
      android:id="@+id/idIVImage"
      android:layout_width="match_parent"
      android:layout_height="300dp"
      android:layout_below="@id/idTVHeading"
      android:layout_margin="10dp"
      android:padding="3dp" />

   <!-- creating a button to choose image-->
   <Button
      android:id="@+id/idBtnChooseImage"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@id/idIVImage"
      android:layout_margin="10dp"
      android:padding="4dp"
      android:text="Choose Image"
      android:textAllCaps="false" />

   <!-- creating a button to upload image-->
   <Button
      android:id="@+id/idBtnUploadImage"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@id/idBtnChooseImage"
      android:layout_margin="10dp"
      android:padding="4dp"
      android:text="Upload Image"
      android:textAllCaps="false" />

</RelativeLayout>

说明 - 在上面的代码中,我们正在创建一个根布局作为相对布局。在这个布局中,我们创建一个文本视图来显示应用程序的标题。创建此文本视图后,我们创建一个图像视图。在这个图像视图中,我们将显示用户从其设备中选择的图像。之后,我们添加两个按钮。一个按钮用于从用户设备中选择图像,另一个按钮用于将图像上传到 Firebase Storage。

步骤 4:使用 MainActivity.kt 文件

导航到 app > java > 您的应用程序包名称 > MainActivity.kt 文件,并将以下代码添加到其中。代码中添加了注释以便详细了解。

package com.gtappdevelopers.androidapplication

import android.app.ProgressDialog
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.storage.FirebaseStorage
import com.google.firebase.storage.StorageReference
import java.util.*

class MainActivity : AppCompatActivity() {
   // creating variable for buttons, image view and Uri for file.
   lateinit var chooseImageBtn: Button
   lateinit var uploadImageBtn: Button
   lateinit var imageView: ImageView
   var fileUri: Uri? = null;

   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      // on below line initializing variables for buttons and image view.
      chooseImageBtn = findViewById(R.id.idBtnChooseImage)
      uploadImageBtn = findViewById(R.id.idBtnUploadImage)
      imageView = findViewById(R.id.idIVImage)

      // on below line adding click listener for our choose image button.
      chooseImageBtn.setOnClickListener {
         // on below line calling intent to get our image from phone storage.
         val intent = Intent()
         // on below line setting type of files which we want to pick in our case we are picking images.
         intent.type = "image/*"
         // on below line we are setting action to get content
         intent.action = Intent.ACTION_GET_CONTENT
         // on below line calling start activity for result to choose image.
         startActivityForResult(
            // on below line creating chooser to choose image.
            Intent.createChooser(
               intent,
               "Pick your image to upload"
            ),
            22
         )
      }

      // on below line adding click listener to upload image.
      uploadImageBtn.setOnClickListener {
         // on below line calling upload image button to upload our image.
         uploadImage()
      }
   }

   // on below line adding on activity result method this method is called when user picks the image.
   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
      super.onActivityResult(requestCode, resultCode, data)
      // on below line we are checking if the result is ok
      if (requestCode == 22 && resultCode == RESULT_OK && data != null && data.data != null) {
         // on below line initializing file uri with the data which we get from intent
         fileUri = data.data
         try {
            // on below line getting bitmap for image from file uri.
            val bitmap: Bitmap = MediaStore.Images.Media.getBitmap(contentResolver, fileUri);
            // on below line setting bitmap for our image view.
            imageView.setImageBitmap(bitmap)
         } catch (e: Exception) {
            // handling exception on below line
            e.printStackTrace()
         }
      }
   }

   // on below line creating a function to upload our image.
   fun uploadImage() {
      // on below line checking weather our file uri is null or not.
      if (fileUri != null) {
         // on below line displaying a progress dialog when uploading an image.
         val progressDialog = ProgressDialog(this)
         // on below line setting title and message for our progress dialog and displaying our progress dialog.
         progressDialog.setTitle("Uploading...")
         progressDialog.setMessage("Uploading your image..")
         progressDialog.show()

         // on below line creating a storage refrence for firebase storage and creating a child in it with
         // random uuid.
         val ref: StorageReference = FirebaseStorage.getInstance().getReference()
         .child(UUID.randomUUID().toString())
         // on below line adding a file to our storage.
         ref.putFile(fileUri!!).addOnSuccessListener {
            // this method is called when file is uploaded.
            // in this case we are dismissing our progress dialog and displaying a toast message
            progressDialog.dismiss()
            Toast.makeText(applicationContext, "Image Uploaded..", Toast.LENGTH_SHORT).show()
         }.addOnFailureListener {
            // this method is called when there is failure in file upload.
            // in this case we are dismissing the dialog and displaying toast message
            progressDialog.dismiss()
            Toast.makeText(applicationContext, "Fail to Upload Image..", Toast.LENGTH_SHORT)
            .show()
         }
      }
   }
}

说明 - 在上面的代码中,我们首先为图像视图、上传图像按钮、选择图像按钮和我们的文件 uri 的 URI 变量创建变量。然后,在我们的 onCreate 方法中,我们使用我们在 activity_main.xml 中指定的 id 初始化这些变量。

然后,我们为“选择图像”按钮添加一个点击监听器。在点击方法中,我们为意图创建一个变量,然后将其类型设置为图像,因为我们想要选择图像。然后,我们将它的操作设置为获取图像。之后,我们将设置 start activity for the result 来显示我们的图像选择器。在此,我们创建了一个图像选择器,用于从用户的设备中选择我们的图像。

之后,我们创建一个 onActivityResult 方法,我们将在其中将用户选择的图像设置到我们的图像视图中。在这个方法中,我们首先从我们选择的图像中获取数据并将其设置为我们的文件 uri。之后,我们从该文件 uri 创建一个位图并将该位图设置为我们的图像视图,以在我们的图像视图中显示选定的图像。

之后,我们创建一个上传图像的方法。在这个方法中,我们检查文件 uri 是否不为空。在这种情况下,我们在下面的行中显示一个进度条以显示图像上传的进度。在这个进度对话框中,我们显示此进度对话框的标题和消息。然后在下面的行中,我们创建一个存储引用变量来获取我们必须上传图像的引用。在这个引用中,我们指定一个随机 uuid 来上传我们的图像。之后,我们调用 put file 方法将我们的文件上传到 Firebase 存储。对于此方法,有两个回调,一个是 onSuccessListner。当我们的图像上传时,将调用此方法,并且在此方法中,我们将显示一条吐司消息并关闭我们的进度对话框。另一个方法是 onFailureListner。当图像上传操作失败时,将调用此方法。在这种情况下,我们也显示吐司消息并关闭我们的进度对话框。

步骤 5:向 AndroidManifest.xml 文件添加权限

导航到 app > AndroidManifest.xml 并向其中添加以下 internet 和 read storage 权限。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

步骤 6:在 Firebase 控制台中配置 Firebase Storage

导航到 https://console.firebase.google.com/ 以访问 Firebase 控制台。确保您使用在 Android Studio 中登录的同一帐户登录。之后,您必须导航到 Firebase 控制台左侧面板中的“构建选项”。从中点击“Storage”以添加项目的 Firebase Storage。之后,您只需点击“Get started”选项,然后您将看到以下屏幕。

在此,请确保选择“测试模式”,因为我们没有为我们的应用程序实现用户身份验证。然后只需点击“Next”以配置 Firebase Storage。

现在点击绿色播放图标来运行您的应用程序。

注意 - 确保您已连接到您的真实设备或模拟器

结论

在以上教程中,我们学习了什么是 Firebase Storage 以及如何在 Android 应用程序中使用它来存储其中的图像。

更新于:2023年3月14日

5000+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

开始
广告