【问题标题】:How to update profile picture for firebase user android? [duplicate]如何更新firebase用户android的个人资料图片? [复制]
【发布时间】:2019-02-26 22:05:36
【问题描述】:

我的用户有用户名、电子邮件和个人资料图片,但我在注册时将个人资料图片设置为空字符串。我正在尝试更新个人资料图片并将其设置为当前用户,但出现错误。

mProfilePic.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT);
        }
    });

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == GALLERY_INTENT && resultCode == RESULT_OK && data != null && data.getData() != null){
        mainImageURI = data.getData();
        try {
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), mainImageURI);
            mProfilePic.setImageBitmap(bitmap);
            final ProgressDialog proDialog = new ProgressDialog(HomeActivity.this);
            proDialog.setTitle("Uploading...");
            proDialog.show();

            final StorageReference mRef = mStorage.child("Photos").child(mainImageURI.getLastPathSegment());
            mRef.putFile(mainImageURI).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Task<Uri> uri = taskSnapshot.getMetadata().getReference().getDownloadUrl();
                    Log.i("uploaded", mDatabase.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("image").setValue(uri).toString());
                    mDatabase.getReference("Users").child(mAuth.getCurrentUser().getUid()).child("image").setValue(uri).toString();
                    proDialog.dismiss();
                    Toast.makeText(HomeActivity.this, "Uploaded", Toast.LENGTH_LONG).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    proDialog.dismiss();
                    Toast.makeText(HomeActivity.this, "Upload Failed "+e.getMessage(), Toast.LENGTH_LONG).show();
                }
            })
            .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                    double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot.getTotalByteCount());
                    proDialog.setMessage("Uploaded "+(int)progress+"%");
                }
            });
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

如果我取出与连接到用户有关的任何内容,代码就可以工作。

这是我得到的错误:

09-22 23:12:05.896 20706-20706/com.example.kisha.androidapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.kisha.androidapp, PID: 20706
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source:130)
        at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source:253)
        at com.google.android.gms.internal.firebase_database.zzkt.zzh(Unknown Source:0)
        at com.google.firebase.database.DatabaseReference.zza(Unknown Source:10)
        at com.google.firebase.database.DatabaseReference.setValue(Unknown Source:7)
        at com.example.kisha.androidapp.HomeActivity$4.onSuccess(HomeActivity.java:129)
        at com.example.kisha.androidapp.HomeActivity$4.onSuccess(HomeActivity.java:125)
        at com.google.firebase.storage.zzi.zza(Unknown Source:13)
        at com.google.firebase.storage.zzac.zza(Unknown Source:2)
        at com.google.firebase.storage.zzaf.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

用户->(uid)->用户名、电子邮件、图片 当用户注册时,所有字段都是字符串,图像为空

【问题讨论】:

  • 你能发布你的数据库结构吗?您的数据库引用有问题
  • @GastónSaillén 我已经添加了数据库结构
  • 我认为问题可能出在你的 uri 中,因为 setValue 抛出错误,你能记录下那个 Task uri = taskSnapshot.getMetadata().getReference().getDownloadUrl();返回?
  • 请查看文档以了解如何更新 FirebaseUser 对象的属性。
  • 这就是它所记录的:com.google.android.gms.tasks.zzu@51f60f7

标签: java android firebase firebase-realtime-database firebase-storage


【解决方案1】:

这是更新头像的方法,然后你可以根据mFirebaseUser回调它。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg"))
        .build();

user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User profile updated.");
                }
            }
        });

【讨论】:

  • 如何让 uri 解析
  • 1.把链接(字符串)。 2. 在链接处按 ALT + ENTER(字符串)
  • 如何获取用户从手机照片存储中获取的图片链接?
  • 显然,从手机获取图像,然后上传到firebase数据库。
  • 所以我应该把代码中的 uri 放到 uri.parse 中?
猜你喜欢
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2017-09-12
  • 2020-11-02
  • 2017-05-04
相关资源
最近更新 更多