开发者社区> 问答> 正文

Kotlin-Firebase-将Uri保存到用户的文件夹图像后,保存错误的Uri

我正在尝试构建类似Instagram的应用程序,当我尝试将拍摄的照片保存到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-599f82965 ”

这是我的Share 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!!)
                    }
                }
        }
    }
}
这是我在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上传到用户的“图像”文件夹的方法

这是我的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
    )
}
}

展开
收起
Puppet 2020-01-12 09:51:59 795 0
1 条回答
写回答
取消 提交回答
  • 您没有putFile(imageUri)正确使用结果。你有:

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

    那it.toString()不是URL。 it是由返回的UploadTask对象putFile()。您不能仅仅将其转换为字符串-这是您需要观察以获取结果的Task。

    您似乎在正确地获取下载URL,uploadUserPhoto以downloadUrl用于获取要写入的URL。您将不得不采用这种方式。

    另请参阅文档和此问题。

    2020-01-12 09:52:27
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载