Android Kotlin-Firebase-将Uri保存到用户';s文件夹图像一直保存错误的Uri
我正在尝试构建一个类似Instagram的应用程序,当我试图将拍摄的照片保存到Firebase数据库上用户文件夹“images”时,出现了一个问题。它不断保存类似“com.google.firebase.storage”的内容。UploadTask@62873ce" 而不是像这样的链接: “” 这是我的分享活动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
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()
不是URLit
是由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!!)
}
}
}
}