Nitin Kashyap
Nitin Kashyap

Reputation: 15

Kotlin - Cant upload an image to firebase storage

Here I'm trying to upload an image from the local storage to the firebase storage. I'm uploading the image using its 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}")

            }
    }

}

following is the rules for the firebase stroage

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

firebase authentication part is working fine, users are added successfully. But I'm unable to upload an image. I have included internet permissions in the manifest file. And I'm not getting any error message So, please help

Upvotes: 0

Views: 523

Answers (1)

Premtim Farizi
Premtim Farizi

Reputation: 26

Here: val selectedPhotoUri = data.data you are not reassigning the global property selectedPhotoUri, but creating a new one.

Then, here: if (selectedPhotoUri == null) return you are checking with the global property which is always null.

Upvotes: 1

Related Questions