Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin-Firebase-将Uri保存到用户';s文件夹图像一直保存错误的Uri_Android_Firebase_Kotlin_Firebase Realtime Database_Firebase Storage - Fatal编程技术网

Android Kotlin-Firebase-将Uri保存到用户';s文件夹图像一直保存错误的Uri

Android Kotlin-Firebase-将Uri保存到用户';s文件夹图像一直保存错误的Uri,android,firebase,kotlin,firebase-realtime-database,firebase-storage,Android,Firebase,Kotlin,Firebase Realtime Database,Firebase Storage,我正在尝试构建一个类似Instagram的应用程序,当我试图将拍摄的照片保存到Firebase数据库上用户文件夹“images”时,出现了一个问题。它不断保存类似“com.google.firebase.storage”的内容。UploadTask@62873ce" 而不是像这样的链接: “” 这是我的分享活动 class ShareActivity : BaseActivity(2) { private val TAG = "ShareActivity" private lat

我正在尝试构建一个类似Instagram的应用程序,当我试图将拍摄的照片保存到Firebase数据库上用户文件夹“images”时,出现了一个问题。它不断保存类似“com.google.firebase.storage”的内容。UploadTask@62873ce"

而不是像这样的链接: “”

这是我的分享活动

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!!)
                    }
                }
        }
    }
}
以下是FirebaseHelper.kt中的uploadUserPhoto和updateUsePhoto函数

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上传到用户的“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
    )
}

}您没有正确使用来自
putFile(imageUri)
的结果。你有:

putFile(imageUri).addOnCompleteListener {
    if (it.isSuccessful){
        mFirebase.database.child("images").child(uid).push()
            .setValue(it.toString())
it.toString()
不是URL
it
是由
putFile()
返回的UploadTask对象。你不能把它变成一个字符串——这是一项你需要观察才能得到结果的任务

您似乎在
uploadUserPhoto
中正确获取下载URL,使用
downloadUrl
获取要写入的URL。你将不得不这样做

另请参见和。

我设法解决了它。 如果有人需要它,下面是工作函数share():


setValue(it.toString())
--
it
我想这是您的
上传任务。我大约一年没有使用Firebase实时数据库了,但我怀疑您是否在
UploadTask
上调用
toString()
来获取URL。您在哪里调用uploadUserPhoto?尝试过了,它会使应用程序崩溃,并给出com.google.firebase.database.DatabaseException:为name:getResult找到冲突的getter@CommonsWare@DougStevenson我在另一个上传个人资料图片的函数中调用了它,但我共享了这段代码只是为了让你们看到正确工作的代码,我不知道如何设置我的私人乐趣共享()要像这样工作,请尝试删除toString()-它会使应用程序崩溃,并给出com.google.firebase.database.DatabaseException:为name:getResultTried找到冲突的getter到底是什么?这个答案解释了为什么你现在拥有的东西不起作用。除了在
uploadUserPhoto
中,您根本没有获取下载URL,您甚至没有调用它。如果你有其他代码不起作用,它会产生一个全新的错误,我想这应该是一个新的问题。我是编程新手,所以,我不能仅仅遵循你提供给我的文档。我删除了toString(),只留下了“it”,当我点击share photo后,应用程序崩溃了。另外,我刚刚写了“updateUserPhoto”,希望有人能告诉我如何修复我的私人娱乐共享()“updateUserPhoto”的修复方式这不是我推荐的解决方案。您需要使用downloadUrl从引用中获取下载URL,方法与我提供的
uploadUserPhoto
和这两个链接中使用的方法相同。我指出,您已经知道如何获取下载URL-您正在问题中发布的
uploadUserPhoto
中进行此操作。链接问题还提供了代码示例。您可以根据自己的情况调整这些设置。
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!!)
                }
            }
    }
}