【发布时间】:2021-09-10 01:49:02
【问题描述】:
我想将图像从设备上传到 Firebase 中的存储。我已经完成了所有类似文档的操作,但它给了我这个错误。
E/UploadTask: could not locate file for uploading:file:///content%3A/com.google.android.apps.photos.contentprovider/-1/1/content%253A%252F%252Fmedia%252Fexternal%252Fimages%252Fmedia%252F31/ORIGINAL/NONE/image%252Fjpeg/446954168
E/StorageException: StorageException has occurred.
An unknown error occurred, please check the HTTP result code and inner exception for server response.
Code: -13000 HttpResult: 0
E/StorageException: /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
java.io.FileNotFoundException: /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileInputStream.<init>(FileInputStream.java:160)
at java.io.FileInputStream.<init>(FileInputStream.java:115)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1473)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:137)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:241)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addImagetoDb(AddItemViewModel.kt:29)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addtoDb$lambda-0(AddItemViewModel.kt:19)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.lambda$N5o2mCXPU9IS7gghhVKoBmB96Bo(Unknown Source:0)
at com.example.admin_bookmarket.ViewModel.-$$Lambda$AddItemViewModel$N5o2mCXPU9IS7gghhVKoBmB96Bo.onSuccess(Unknown Source:6)
at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7542)
at libcore.io.IoBridge.open(IoBridge.java:478)
at java.io.FileInputStream.<init>(FileInputStream.java:160)
at java.io.FileInputStream.<init>(FileInputStream.java:115)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1473)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:137)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:241)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addImagetoDb(AddItemViewModel.kt:29)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addtoDb$lambda-0(AddItemViewModel.kt:19)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.lambda$N5o2mCXPU9IS7gghhVKoBmB96Bo(Unknown Source:0)
at com.example.admin_bookmarket.ViewModel.-$$Lambda$AddItemViewModel$N5o2mCXPU9IS7gghhVKoBmB96Bo.onSuccess(Unknown Source:6)
at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
E/StorageException: StorageException has occurred.
An unknown error occurred, please check the HTTP result code and inner exception for server response.
Code: -13000 HttpResult: 0
/content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
java.io.FileNotFoundException: /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:492)
at java.io.FileInputStream.<init>(FileInputStream.java:160)
at java.io.FileInputStream.<init>(FileInputStream.java:115)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1473)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:137)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:241)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addImagetoDb(AddItemViewModel.kt:29)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addtoDb$lambda-0(AddItemViewModel.kt:19)
at com.example.admin_bookmarket.ViewModel.AddItemViewModel.lambda$N5o2mCXPU9IS7gghhVKoBmB96Bo(Unknown Source:0)
at com.example.admin_bookmarket.ViewModel.-$$Lambda$AddItemViewModel$N5o2mCXPU9IS7gghhVKoBmB96Bo.onSuccess(Unknown Source:6)
at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Linux.open(Native Method)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7542)
at libcore.io.IoBridge.open(IoBridge.java:478)
这是我获取 imageUri 并从 viewModel 调用函数以将其上传到 Storage 的代码。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK && requestCode == pickImage) {
imageUri = data?.data
path = data?.data?.path!!
binding.idThumbnail.setImageURI(imageUri)
binding.idTnBackground.setImageURI(imageUri)
binding.idImgeURL.setText(imageUri.toString(), TextView.BufferType.EDITABLE)
}
}
fun addNewBook()
{
if (binding.idCount.text.toString() != "" && binding.idImgeURL.text.toString() != "" && binding.idAuthor.text.toString() != "" &&
binding.idTitle.text.toString() != "" && binding.idDescription.text.toString() != "" && binding.idPrice.text.toString() != "" &&
binding.idKind.text.toString() != "")
{
newBook = mutableMapOf("Image" to binding.idImgeURL.text.toString(), "Name" to binding.idTitle.text.toString(),
"Author" to binding.idAuthor.text.toString(), "Price" to binding.idPrice.text.toString().toDouble().roundToInt(), "rate" to "0".toDouble().roundToInt(),
"Kind" to binding.idKind.text.toString(), "Counts" to binding.idCount.text.toString().toDouble().roundToInt(), "Description" to binding.idDescription.text.toString())
viewModel.addtoDb(newBook)
binding.idCount.setText("", TextView.BufferType.EDITABLE)
binding.idImgeURL.setText("", TextView.BufferType.EDITABLE)
binding.idAuthor.setText("", TextView.BufferType.EDITABLE)
binding.idTitle.setText("", TextView.BufferType.EDITABLE)
binding.idDescription.setText("", TextView.BufferType.EDITABLE)
binding.idPrice.setText("", TextView.BufferType.EDITABLE)
binding.idKind.setText("", TextView.BufferType.EDITABLE)
}
Toast.makeText(this, "Add success", Toast.LENGTH_SHORT).show()
}
下面是从 viewModel 调用上面将其上传到存储的函数
fun addtoDb(newBook: MutableMap<String, Any>)
{
FirebaseFirestore.getInstance().collection("books").add(newBook).addOnSuccessListener {
val id: String = it.id
addImagetoDb(Uri.parse(newBook["Image"].toString()), id)
}
}
fun addImagetoDb(imageUri: Uri, id: String)
{
var storageRef = Firebase.storage.reference
var file = Uri.fromFile(File(imageUri.toString()))
val bookImageRef = storageRef.child("${id}/${file.lastPathSegment}")
val uploadTask = bookImageRef.putFile(file)
uploadTask.addOnSuccessListener {
FirebaseFirestore.getInstance().collection("books").document(id).update("Image", bookImageRef)
}
}
我已经尝试获取“路径”而不是“Uri”,但它给了我同样的错误。 (所有这些都不会导致应用程序崩溃)
我已经添加了以下依赖项:
implementation platform('com.google.firebase:firebase-bom:28.1.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-firestore-ktx:23.0.1'
implementation 'com.google.firebase:firebase-storage-ktx'
implementation 'com.google.firebase:firebase-storage:20.0.0'
implementation 'com.google.firebase:firebase-database:20.0.0'
【问题讨论】:
-
我认为错误消息很清楚:“没有这样的文件或目录”。文件不存在,路径错误。
-
我有另一个 ImageView 来加载我得到的 Uri,它也显示图像。
标签: android firebase kotlin firebase-storage