Kotlin - Firebase - сохранение Uri в изображениях пользователя в папке сохраняет неправильный Uri - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь создать приложение, похожее на Instagram, возникает проблема, когда я пытаюсь сохранить фотографию в папке пользователя "images" в базе данных Firebase. Он сохраняет что-то вроде "com.google.firebase.storage. UploadTask@62873ce"

Вместо ссылки, подобной этой: "https://firebasestorage.googleapis.com/v0/b/gramgram-1b3f9.appspot.com/o/users%2F7q3pqR6GnHMx7NSdgoBqZETkrS32%2Fphoto?alt=media&token=bbcbe556-1de5-4176-aba2-599f829e65"

вот мой Поделиться Activity.kt

class ShareActivity : BaseActivity(2) {
    private val TAG = "ShareActivity"
    private lateinit var mCamera: CameraHelper
    private lateinit var mFirebase: FirebaseHelper


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_share)
        Log.d(TAG, "onCreate")

        mFirebase =FirebaseHelper(this)

        mCamera = CameraHelper(this)
        mCamera.takeCameraPicture()

        back_image.setOnClickListener{finish()}
        share_text.setOnClickListener{share()}
    }


    @SuppressLint("MissingSuperCall")
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == mCamera.REQUEST_CODE){
            if (resultCode == RESULT_OK){
                GlideApp.with(this).load(mCamera.imageUri).centerCrop().into(post_image)
            } else{
                finish()
            }
        }
    }

    private fun share(){
        val imageUri = mCamera.imageUri
        if (imageUri != null){
            val uid = mFirebase.auth.currentUser!!.uid
            mFirebase.storage.child("users").child(uid).child("images")
                .child(imageUri.lastPathSegment!!).putFile(imageUri).addOnCompleteListener {
                    if (it.isSuccessful){
                        mFirebase.database.child("images").child(uid).push()
                            .setValue(it.toString())
                            .addOnCompleteListener{
                                if (it.isSuccessful){
                                    startActivity(Intent(this,
                                        ProfileActivity::class.java))
                                    finish()
                                } else {
                                    showToast(it.exception!!.message!!)
                                }
                            }
                    } else {
                        showToast(it.exception!!.message!!)
                    }
                }
        }
    }
}

вот мои функции uploadUserPhoto и updateUsePhoto в FirebaseHelper.kt

fun uploadUserPhoto(photo: Uri, onSuccess: (String) -> Unit) {
    val uTask = storage.child("users/${auth.currentUser!!.uid}/photo").putFile(photo)
        storage.child("users/${auth.currentUser!!.uid}/photo").putFile(photo)
            .addOnCompleteListener {
        if (it.isSuccessful) {
            uTask.continueWithTask { _ ->
                storage.child("users/${auth.currentUser!!.uid}/photo").downloadUrl
            }.addOnCompleteListener{
                if (it.isSuccessful && it.result != null) {
                    onSuccess(it.result.toString())
                } else {
                    activity.showToast(it.exception!!.message!!)
                }
            }
        }
    }
}


fun updateUserPhoto( photoUrl: String, onSuccess: () -> Unit){
    database.child("users/${auth.currentUser!!.uid}/photo").setValue(photoUrl)
        .addOnCompleteListener {
            if (it.isSuccessful) {
                onSuccess()
            } else {
                activity.showToast(it.exception!!.message!!)
            }
        }
}

Я не уверен, как настроить мой private fun share() для загрузки правильного URL в User's папка "images"

и вот мой CameraHelper.kt

class CameraHelper(private val activity: Activity){
var imageUri: Uri? = null
val REQUEST_CODE = 1
private val simpleDateFormat = SimpleDateFormat(
    "yyyyMMdd_HHmmss",
    Locale.US
)

fun takeCameraPicture() {
    val intent =
        Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    if (intent.resolveActivity(activity.packageManager) != null) {
        val imageFile = createImageFile()
        imageUri = FileProvider.getUriForFile(
            activity,
            "com.example.homeactivity.fileprovider",
            imageFile
        )
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
        activity.startActivityForResult(intent, REQUEST_CODE)
    }
}

private fun createImageFile(): File {
    val storageDir: File? = activity.getExternalFilesDir(
        Environment.DIRECTORY_PICTURES
    )
    return File.createTempFile(
        "JPEG_${simpleDateFormat.format(Date())}_",
        ".jpg",
        storageDir
    )
}

}

Ответы [ 2 ]

1 голос
/ 12 января 2020

Вы неправильно используете результат из putFile(imageUri). У вас есть:

putFile(imageUri).addOnCompleteListener {
    if (it.isSuccessful){
        mFirebase.database.child("images").child(uid).push()
            .setValue(it.toString())

Это it.toString() не URL. it - это объект UploadTask, возвращаемый putFile(). Вы не можете просто превратить это в строку - это задача, которую вы должны соблюдать, чтобы получить результат.

Вы, похоже, правильно выбираете URL загрузки в uploadUserPhoto, используя downloadUrl для извлечения URL для записи. Вместо этого вам придется сделать это таким образом.

См. Также документацию и этот вопрос .

0 голосов
/ 12 января 2020

Мне удалось это решить. В случае, если это кому-то нужно, вот рабочая функция share ():

private fun share(){
    val imageUri = mCamera.imageUri
    if (imageUri != null){
        val uid = mFirebase.auth.currentUser!!.uid
        val uTask = mFirebase.storage.child("users").child(uid).child("images").child(imageUri.lastPathSegment!!).putFile(imageUri)
        mFirebase.storage.child("users").child(uid).child("images").child(imageUri.lastPathSegment!!).putFile(imageUri)
            .addOnCompleteListener {
                if (it.isSuccessful) {
                    uTask.continueWithTask { _ ->
                        mFirebase.storage.child("users").child(uid).child("images")
                            .child(imageUri.lastPathSegment!!).downloadUrl
                    }.addOnCompleteListener {
                        if (it.isSuccessful && it.result != null)
                            mFirebase.database.child("images").child(uid).push()
                                .setValue(it.result.toString())
                                .addOnCompleteListener {
                                    if (it.isSuccessful) {
                                        startActivity(
                                            Intent(
                                                this,
                                                ProfileActivity::class.java
                                            )
                                        )
                                        finish()
                                    } else {
                                        showToast(it.exception!!.message!!)
                                    }
                                }
                    }
                } else {
                    showToast(it.exception!!.message!!)
                }
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...