我正在使用"使用 Google 登录"方法在我的应用中登录用户。
问题 -更新:
-
如果我卸载应用程序(在注销或不注销后(并重新安装该应用程序,FirebaseAuth.getInstance((.getCurrentUser(( 将变为非空值。因此,用户可以访问该帐户。
-
我什至尝试清除应用程序数据,问题仍然存在。
在添加"FirebaseInstanceIdService"和"FirebaseMessagingService"服务之前,该应用程序运行良好。意味着,它在卸载后自动注销。
清单.xml
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
<meta-data android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data android:name="firebase_analytics_collection_enabled"
android:value="false" />
....
<service
android:name=".services.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name=".services.MyFirebaseInstanceIDService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
....
MyFirebaseMessagingService.class
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MessagingService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Log.e(TAG, String.valueOf(remoteMessage));
}
}
MyFirebaseInstanceIDService.class
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "InstanceIdService";
@Override
public void onTokenRefresh() {
super.onTokenRefresh();
if (FirebaseAuth.getInstance().getCurrentUser() == null){
return;
}
String tokenId = FirebaseInstanceId.getInstance().getToken();
saveTokenIdToDatabase(tokenId);
}
}
登录帐户方法
private void signOutAccount(){
FirebaseAuth.getInstance.signOut();
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finishAffinity();
}
你不是唯一一个为此苦苦挣扎的人。我有类似的问题。重新安装(或更新(应用程序后,在BaseActivity中,我检查了用户是否已登录。他是..FirebaseAuth.getInstance().getCurrentUser()
返回非空值。因此,当我使用uid
从Firebase数据库获取数据时,我遇到了一团糟-一些随机项目。
另请注意,我只能在某些设备上重现它。例如,我在Nexus 5x上获得了非空值,但在Oneplue 3t(8.0.0( 上没有。
经过一番调查,我发现了几个有趣的事实。
事实 #1(文档(
在某些情况下,
getCurrentUser
将返回非空值 FirebaseUser,但底层令牌无效。
事实上,当getCurrentUser() != null
时,您无法确定用户是否实际登录。我的结论是,我不能依赖getCurrentUser
,我应该重新考虑如何检查用户是否登录(作为一种选项(。
事实#2
Android 应用程序有时会在重新安装应用程序后记住其数据,因为 自动备份。有关更多详细信息,请参阅帖子。
溶液
<application
android:allowBackup="false"
android:fullBackupContent="false"
...>
我将android:allowBackup
和android:fullBackupContent
设置为假。因此,当我重新安装(或更新它(时,Firebase 当前用户null
。