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

Kotlin - Cant upload an image to firebase storage

我在这里尝试将图像从本地存储上传到 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 stroage 的规则

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

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

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

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