Kotlin - 无法将图像上传到 Firebase 存储

Posted

技术标签:

【中文标题】Kotlin - 无法将图像上传到 Firebase 存储【英文标题】:Kotlin - Cant upload an image to firebase storage 【发布时间】:2021-09-18 00:13:33 【问题描述】:

我正在尝试将图像从本地存储上传到 Firebase 存储。 我正在使用它的 URI 上传图片

package com.example.demochat

import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.storage.FirebaseStorage
import java.util.*

class RegisterActivity : AppCompatActivity() 

    private lateinit var username: EditText
    private lateinit var email: EditText
    private lateinit var password: EditText
    private lateinit var register: Button
    private lateinit var haveAccount: TextView
    private lateinit var imageInsert: Button
    private lateinit var imageView: ImageView
    private val tag: String = "RegisterActivity"


    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register)

        username = findViewById(R.id.editTextUsername)
        email = findViewById(R.id.editTextTextEmailAddress)
        password = findViewById(R.id.editTextTextPassword)
        register = findViewById(R.id.buttonRegister)
        haveAccount = findViewById(R.id.textViewAlready_have_an_account)
        imageInsert = findViewById(R.id.buttonInsertImage)
        imageView = findViewById(R.id.imageViewImageInsert)


        imageInsert.setOnClickListener 
            selectImage()
        

        register.setOnClickListener 
            performRegister()
        
        haveAccount.setOnClickListener 
            val intent = Intent(this@RegisterActivity, LoginActivity::class.java)
            startActivity(intent)
        
    

    private var selectedPhotoUri: Uri? = null

    private fun selectImage() 
        Log.d(tag, "clicked image button")
        val intent = Intent()
        intent.type = "image/*"
        intent.action = Intent.ACTION_GET_CONTENT
        startActivityForResult(intent, 100)
    

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 100 && resultCode == RESULT_OK && data != null && data.data != null) 
            Toast.makeText(this@RegisterActivity, "clicked image selected", Toast.LENGTH_SHORT)
                .show()

            val selectedPhotoUri = data.data
            Toast.makeText(this@RegisterActivity, "$selectedPhotoUri", Toast.LENGTH_SHORT).show()
            imageView.setImageURI(selectedPhotoUri)
        
    

    private fun performRegister() 
        if (email.text.isEmpty() || password.text.isEmpty()) 
            Toast.makeText(this, "Fill the above details", Toast.LENGTH_SHORT).show()
            return
        
        FirebaseAuth.getInstance()
            .createUserWithEmailAndPassword(email.text.toString(), password.text.toString())
            .addOnCompleteListener 
                if (!it.isSuccessful) return@addOnCompleteListener

                Log.d(tag, "uid = $it.result?.user?.uid")

                uploadImageToFirebase()

            
            .addOnFailureListener 
                Toast.makeText(this, "$it.message", Toast.LENGTH_SHORT).show()
                Log.d(tag, "$it.message")
            
    

    private fun uploadImageToFirebase() 
        if (selectedPhotoUri == null) return

        val fileName = UUID.randomUUID().toString() + ".jpg"

        val refStorage = FirebaseStorage.getInstance().reference.child("/images/$fileName")

        refStorage.putFile(selectedPhotoUri!!)
            .addOnSuccessListener 
                Log.d(tag, "image uploaded")
            
            .addOnFailureListener 
                Log.d("RegisterActivity", "$it.message")

            
    


以下是 Firebase 存储的规则

rules_version = '2';
service firebase.storage 
  match /b/bucket/o 
    match /allPaths=** 
      allow read, write;
    
  


firebase 身份验证部分工作正常,已成功添加用户。但我无法上传图片。我在清单文件中包含了互联网权限。 而且我没有收到任何错误消息 所以,请帮忙

【问题讨论】:

但我无法上传图片。没有提供足够的信息,因此我们可以提供帮助。这段代码中究竟有什么不能按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗? 代码不会将图像上传到 Firebase 存储。并且代码没有错误。 在继续之前,请花点时间阅读How do I ask a good question?。 我的逻辑错了吗??或者我说的方法是错误的 对不起,先生,浪费您的时间了。 【参考方案1】:

这里: val selectedPhotoUri = data.data 您不是重新分配全局属性 selectedPhotoUri,而是创建一个新属性。

然后,这里: if (selectedPhotoUri == null) 返回 您正在检查始终为空的全局属性。

【讨论】:

以上是关于Kotlin - 无法将图像上传到 Firebase 存储的主要内容,如果未能解决你的问题,请参考以下文章

将图片从 URL 上传到 Firebase 存储

将图像上传到 Firebase 存储后如何获取图像 uri?

使用 kotlin for android app 将 pdf 文件上传到 firebase 存储

无法从 python 服务器将图像上传到 Firebase 存储

反应原生无法将图像上传到firebase

无法在颤动中使用 dio 将图像上传到 api