我有一个应用程序,有许多用户,他们都存储在实时数据库中。我试图删除用户的按钮点击所有数据,但个人资料图片仍然留在Firebase存储删除后。所以当我试图删除图片从Firebase存储以及用户我得到这个错误。用户没有权限访问这个对象。
因此,我尝试删除ValueEventListener方法中的图片,因为我可以很容易地从实时数据库中获取ImageURL。
实时数据库
在数据库中,我有属性profileimage:GeneratedPictureUrlWhenUploadingToStorage此外,我在Firebase存储中的图片命名为currentUserId +“.JPG”,因此它就像一个标识符
储存规则:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
代码:
switch (view.getId()){
case R.id.buttonEditProfile:
startActivity(new Intent(this, ProfileEditActivity.class));
break;
case R.id.buttonUserList:
startActivity(new Intent(this, UserListActivity.class));
break;
case R.id.buttonDeleteAccount:
profileUserRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
StorageReference storageReference1;
String myImage = dataSnapshot.child("profileimage").getValue().toString();
storageReference1 = FirebaseStorage.getInstance().getReferenceFromUrl(myImage);
storageReference1.delete();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
DatabaseReference drFailure = FirebaseDatabase.getInstance().getReference("failures").child(currentUserId);
DatabaseReference drVehicles = FirebaseDatabase.getInstance().getReference("vehicles").child(currentUserId);
DatabaseReference drUsers = FirebaseDatabase.getInstance().getReference("users").child(currentUserId);
FirebaseUser userDel = FirebaseAuth.getInstance().getCurrentUser();
drFailure.removeValue();
drVehicles.removeValue();
drUsers.removeValue();
userDel.delete();
当我按下按钮删除帐户时,我想删除唯一用户的存储图片
3条答案
按热度按时间mklgxw1f1#
如果您收到权限错误,可能是存储规则阻止了您的访问。
还可以尝试使用文件名逻辑删除文件。例如:
8aqjt8rx2#
如果您没有来自以下位置的firebase代码,您也可以更改规则:
收件人:
从firebase获取代码后,请确保将其更改回来
yqlxgs2m3#
//我做了同样的事情,但它在从firebase检索数据方面工作得很认真
检索用户信息();
用户引用=防火墙数据库.获取示例().获取引用(“用户”).子项(当前用户ID);私有空检索用户信息(){字符串当前用户ID = FirebaseAuth.getInstance().getCurrentUser().getUid();用户引用=防火墙数据库.获取示例().获取引用(“用户”).子项(当前用户ID);用户参考保持同步(真);userRef.addListenerForSingleValueEvent(新值事件监听器(){ @覆盖数据更改时的公共空值(@非空数据快照快照){ if((snapshot.exists())&&(snapshot.hasChild(“image”))){存储参考存储参考1;
}