Android 即使在删除侦听器之后,客户端也没有执行此操作错误的权限
我正在我的应用程序中使用Firebase身份验证,我的Android 即使在删除侦听器之后,客户端也没有执行此操作错误的权限,android,firebase,kotlin,firebase-realtime-database,firebase-authentication,Android,Firebase,Kotlin,Firebase Realtime Database,Firebase Authentication,我正在我的应用程序中使用Firebase身份验证,我的设置活动中有以下代码,允许用户注销并返回登录活动: val logOutPreference: Preference = findPreference("logout_preference")!! logOutPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { userInfo.removeEve
设置活动
中有以下代码,允许用户注销并返回登录活动
:
val logOutPreference: Preference = findPreference("logout_preference")!!
logOutPreference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
userInfo.removeEventListener(listener)
auth.signOut()
val intent = Intent(this@SettingsFragment.context, LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
true
}
userInfo = database.getReference("users").child(auth.currentUser!!.uid)
listener = userInfo.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (postSnapshot in dataSnapshot.children) {
if (postSnapshot.key == "firstName") {
firstNamePreference.text = postSnapshot.getValue(String::class.java)
} else if (postSnapshot.key == "lastName") {
lastNamePreference.text = postSnapshot.getValue(String::class.java)
} else if (postSnapshot.key == "username") {
userNamePreference.title =
"Username: ${postSnapshot.getValue(String::class.java)}"
}
}
}
override fun onCancelled(databaseError: DatabaseError) {
Toast.makeText(
context, databaseError.message,
Toast.LENGTH_LONG
).show()
}
})
我在我的设置活动中使用Firebase实时数据库
:
val logOutPreference: Preference = findPreference("logout_preference")!!
logOutPreference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
userInfo.removeEventListener(listener)
auth.signOut()
val intent = Intent(this@SettingsFragment.context, LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
true
}
userInfo = database.getReference("users").child(auth.currentUser!!.uid)
listener = userInfo.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (postSnapshot in dataSnapshot.children) {
if (postSnapshot.key == "firstName") {
firstNamePreference.text = postSnapshot.getValue(String::class.java)
} else if (postSnapshot.key == "lastName") {
lastNamePreference.text = postSnapshot.getValue(String::class.java)
} else if (postSnapshot.key == "username") {
userNamePreference.title =
"Username: ${postSnapshot.getValue(String::class.java)}"
}
}
}
override fun onCancelled(databaseError: DatabaseError) {
Toast.makeText(
context, databaseError.message,
Toast.LENGTH_LONG
).show()
}
})
代码成功地注销了用户,但我得到的祝酒词是客户端没有执行此操作的权限
。为什么我要吃烤面包?我在注销用户之前删除了侦听器,因此我不明白为什么仍然会出现此错误
下面是设置活动的完整代码。我之所以包含此内容,是因为我不知道是否需要删除另一个侦听器来修复此错误:
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
supportFragmentManager
.beginTransaction()
.replace(R.id.settings, SettingsFragment())
.commit()
}
class SettingsFragment : PreferenceFragmentCompat() {
private lateinit var auth: FirebaseAuth
private lateinit var database: FirebaseDatabase
private lateinit var userInfo: DatabaseReference
private lateinit var listener: ValueEventListener
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
auth = FirebaseAuth.getInstance()
database = FirebaseDatabase.getInstance()
val firstNamePreference: EditTextPreference = findPreference("first_name_preference")!!
val lastNamePreference: EditTextPreference = findPreference("last_name_preference")!!
val userNamePreference: Preference = findPreference("username_preference")!!
val notificationsPreference: SwitchPreference = findPreference("notifications_switch_preference")!!
val logOutPreference: Preference = findPreference("logout_preference")!!
val deleteAccountPreference: Preference = findPreference("delete_account_preference")!!
if (notificationsPreference.isChecked) {
notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_active)
} else {
notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_off)
}
userInfo = database.getReference("users").child(auth.currentUser!!.uid)
listener = userInfo.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (postSnapshot in dataSnapshot.children) {
if (postSnapshot.key == "firstName") {
firstNamePreference.text = postSnapshot.getValue(String::class.java)
} else if (postSnapshot.key == "lastName") {
lastNamePreference.text = postSnapshot.getValue(String::class.java)
} else if (postSnapshot.key == "username") {
userNamePreference.title =
"Username: ${postSnapshot.getValue(String::class.java)}"
}
}
}
override fun onCancelled(databaseError: DatabaseError) {
Toast.makeText(
context, databaseError.message,
Toast.LENGTH_LONG
).show()
}
})
firstNamePreference.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { preference, newValue ->
userInfo.child("firstName").setValue(newValue)
false
}
lastNamePreference.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { preference, newValue ->
userInfo.child("lastName").setValue(newValue)
false
}
notificationsPreference.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { preference, newValue ->
val switched: Boolean = newValue as? Boolean ?: false
if (switched) {
notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_active)
} else {
notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_off)
}
true
}
logOutPreference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
userInfo.removeEventListener(listener)
auth.signOut()
val intent = Intent(this@SettingsFragment.context, LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
true
}
deleteAccountPreference.onPreferenceClickListener =
Preference.OnPreferenceClickListener {
userInfo.removeValue()
userInfo.removeEventListener(listener)
auth.currentUser!!.delete()
val intent = Intent(this@SettingsFragment.context, RegisterActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
true
}
}
}
}