Firebase Auth:我想获取当前用户的个人资料照片并将其上传到 firebase 数据库或存储
Firebase Auth: I want to get the current user profile photo and upload it to firebase database or storage
我想在我的聊天应用程序的图片查看器中显示个人资料图片。我已经实现了 firebase 身份验证登录方法,例如 google 和 facebook。所以我想在他们聊天时显示用户图像。我可以通过 FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl();
显示当前用户的图像,但是当我想获得另一个用户的图像时?所以我尝试了下面的方法,
注册该应用后,我可以获得他们的个人资料图片并将其上传到 firebase 存储。之后我可以在应用程序的聊天头中使用它。下面是代码
Uri dpUri = currentFirebaseUser.getPhotoUrl();
if (dpUri != null) {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Uploading...");
progressDialog.show();
final StorageReference ref = storageReference.child(currentFirebaseUser.getUid());
ref.putFile(dpUri)
.addOnSuccessListener(taskSnapshot -> {
ref.getDownloadUrl().addOnSuccessListener(uri -> databaseReference.child("Users").child(currentFirebaseUser.getUid()).child("URL").setValue(uri.toString()));
progressDialog.dismiss();
LocationOn();
})
.addOnFailureListener(e -> {
progressDialog.dismiss();
Toast.makeText(SignActivity.this, "Failed " + e.getMessage(), Toast.LENGTH_SHORT).show();
})
.addOnProgressListener(taskSnapshot -> {
double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded " + (int) progress + "%");
});
}
但不可读,我收到此错误:
E/UploadTask: could not locate file for uploading:https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
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: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
java.io.FileNotFoundException: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1979)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1808)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1485)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:131)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:240)
at com.myapp.SignActivity.uploadImage(SignActivity.java:143)
at com.axresapps.wheresapplk.SignActivity.lambda$onCreate$SignActivity(SignActivity.java:123)
at com.myapp.-$$Lambda$SignActivity$__O5f7J8hhcqZRFrdV0j4-3CaQk.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access00(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
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: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
java.io.FileNotFoundException: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1979)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1808)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1485)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:131)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:240)
at com.axresapps.wheresapplk.SignActivity.uploadImage(SignActivity.java:143)
at com.myapp.SignActivity.lambda$onCreate$SignActivity(SignActivity.java:123)
at com.axresapps.wheresapplk.-$$Lambda$SignActivity$__O5f7J8hhcqZRFrdV0j4-3CaQk.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access00(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
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: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
java.io.FileNotFoundException: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1979)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1808)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1485)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:131)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:240)
at com.axresapps.wheresapplk.SignActivity.uploadImage(SignActivity.java:143)
at com.axresapps.wheresapplk.SignActivity.lambda$onCreate$SignActivity(SignActivity.java:123)
at com.axresapps.wheresapplk.-$$Lambda$SignActivity$__O5f7J8hhcqZRFrdV0j4-3CaQk.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access00(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
请帮助我修复它或建议我另一种方法来完成我的任务
您可以通过以下三种方式之一将文件上传到 Firebase 存储:1) 本地文件,2) 字节数组,3) base64 编码的数据字符串。您正在使用不支持的图像 URL 调用 putFile
。
您将不得不采用两步法:
- 从URL下载数据到Android设备,
- 然后将数据从 Android 设备上传到存储。
另见:
我建议您在将个人资料图片上传到 FirebaseStorage 之前执行此操作。
- 在
ImageView
上显示图像 url。
- 将图像转换为字节。
val bitmap = (binding.ivPicture.drawable as BitmapDrawable).bitmap
val baos = ByteArrayOutputStream()
bitmap.compress(
Bitmap.CompressFormat.JPEG,
30,
baos
)
val data = baos.toByteArray()
// Create file metadata including the content type
val metadata = storageMetadata {
contentType = "image/jpeg"
}
- 将字节存储到 FirebaseStorage
val uploadTask = storage.putBytes(data, metadata)
uploadTask.addOnFailureListener {
// Handle unsuccessful uploads
Tools.showToast(
this,
"Error uploading image: " + it.message
)
}.addOnSuccessListener {
storage.downloadUrl.addOnCompleteListener { task ->
if (task.isSuccessful) {
//Get download url to store in the database.
val profileUrl = task.result.toString()
} else {
Tools.showToast(
this,
"Error saving: " + task.exception?.message
)
}
}
}
终于找到解决办法了。我做了这样的事情!
if(currentFirebaseUser.getPhotoUrl()!=null){
databaseReference.child("Users").child(currentFirebaseUser.getUid()).child("URL").setValue(currentFirebaseUser.getPhotoUrl().toString());
}
您将在 firebase 数据库中看到图像 url
如果您使用 Google OAuth;
https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
如果你删除 =s96-c ,你可以获得高质量的图像!
https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1
如果您使用任何其他 Oauth 方法。它正在工作,我尝试了 yahoo Oauth,它将通过 currentFirebaseUser.getPhotoUrl().toString()
检索个人资料图像的 url
我想在我的聊天应用程序的图片查看器中显示个人资料图片。我已经实现了 firebase 身份验证登录方法,例如 google 和 facebook。所以我想在他们聊天时显示用户图像。我可以通过 FirebaseAuth.getInstance().getCurrentUser().getPhotoUrl();
显示当前用户的图像,但是当我想获得另一个用户的图像时?所以我尝试了下面的方法,
注册该应用后,我可以获得他们的个人资料图片并将其上传到 firebase 存储。之后我可以在应用程序的聊天头中使用它。下面是代码
Uri dpUri = currentFirebaseUser.getPhotoUrl();
if (dpUri != null) {
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Uploading...");
progressDialog.show();
final StorageReference ref = storageReference.child(currentFirebaseUser.getUid());
ref.putFile(dpUri)
.addOnSuccessListener(taskSnapshot -> {
ref.getDownloadUrl().addOnSuccessListener(uri -> databaseReference.child("Users").child(currentFirebaseUser.getUid()).child("URL").setValue(uri.toString()));
progressDialog.dismiss();
LocationOn();
})
.addOnFailureListener(e -> {
progressDialog.dismiss();
Toast.makeText(SignActivity.this, "Failed " + e.getMessage(), Toast.LENGTH_SHORT).show();
})
.addOnProgressListener(taskSnapshot -> {
double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot
.getTotalByteCount());
progressDialog.setMessage("Uploaded " + (int) progress + "%");
});
}
但不可读,我收到此错误:
E/UploadTask: could not locate file for uploading:https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
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: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
java.io.FileNotFoundException: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1979)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1808)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1485)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:131)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:240)
at com.myapp.SignActivity.uploadImage(SignActivity.java:143)
at com.axresapps.wheresapplk.SignActivity.lambda$onCreate$SignActivity(SignActivity.java:123)
at com.myapp.-$$Lambda$SignActivity$__O5f7J8hhcqZRFrdV0j4-3CaQk.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access00(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
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: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
java.io.FileNotFoundException: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1979)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1808)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1485)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:131)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:240)
at com.axresapps.wheresapplk.SignActivity.uploadImage(SignActivity.java:143)
at com.myapp.SignActivity.lambda$onCreate$SignActivity(SignActivity.java:123)
at com.axresapps.wheresapplk.-$$Lambda$SignActivity$__O5f7J8hhcqZRFrdV0j4-3CaQk.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access00(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
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: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
java.io.FileNotFoundException: No content provider: https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1979)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1808)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1485)
at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:131)
at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:240)
at com.axresapps.wheresapplk.SignActivity.uploadImage(SignActivity.java:143)
at com.axresapps.wheresapplk.SignActivity.lambda$onCreate$SignActivity(SignActivity.java:123)
at com.axresapps.wheresapplk.-$$Lambda$SignActivity$__O5f7J8hhcqZRFrdV0j4-3CaQk.onClick(Unknown Source:4)
at android.view.View.performClick(View.java:8160)
at android.widget.TextView.performClick(TextView.java:16222)
at android.view.View.performClickInternal(View.java:8137)
at android.view.View.access00(View.java:888)
at android.view.View$PerformClick.run(View.java:30236)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
请帮助我修复它或建议我另一种方法来完成我的任务
您可以通过以下三种方式之一将文件上传到 Firebase 存储:1) 本地文件,2) 字节数组,3) base64 编码的数据字符串。您正在使用不支持的图像 URL 调用 putFile
。
您将不得不采用两步法:
- 从URL下载数据到Android设备,
- 然后将数据从 Android 设备上传到存储。
另见:
我建议您在将个人资料图片上传到 FirebaseStorage 之前执行此操作。
- 在
ImageView
上显示图像 url。 - 将图像转换为字节。
val bitmap = (binding.ivPicture.drawable as BitmapDrawable).bitmap
val baos = ByteArrayOutputStream()
bitmap.compress(
Bitmap.CompressFormat.JPEG,
30,
baos
)
val data = baos.toByteArray()
// Create file metadata including the content type
val metadata = storageMetadata {
contentType = "image/jpeg"
}
- 将字节存储到 FirebaseStorage
val uploadTask = storage.putBytes(data, metadata)
uploadTask.addOnFailureListener {
// Handle unsuccessful uploads
Tools.showToast(
this,
"Error uploading image: " + it.message
)
}.addOnSuccessListener {
storage.downloadUrl.addOnCompleteListener { task ->
if (task.isSuccessful) {
//Get download url to store in the database.
val profileUrl = task.result.toString()
} else {
Tools.showToast(
this,
"Error saving: " + task.exception?.message
)
}
}
}
终于找到解决办法了。我做了这样的事情!
if(currentFirebaseUser.getPhotoUrl()!=null){
databaseReference.child("Users").child(currentFirebaseUser.getUid()).child("URL").setValue(currentFirebaseUser.getPhotoUrl().toString());
}
您将在 firebase 数据库中看到图像 url
如果您使用 Google OAuth;
https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1=s96-c
如果你删除 =s96-c ,你可以获得高质量的图像!
https://lh3.googleusercontent.com/a/AATXAJzFGstrkeyXMQUU9XIKEXIL8jgEgm1T-EKi3AW1
如果您使用任何其他 Oauth 方法。它正在工作,我尝试了 yahoo Oauth,它将通过 currentFirebaseUser.getPhotoUrl().toString()