- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道我可以在 stackoverflow 上看到很多关于这个主题的问题,我已经尝试了几乎所有的问题,但还没有成功,所以这是我发布新问题的唯一选择。
我的问题是 FirebaseAuth.getInstance 总是返回 null,即使我已经初始化了 FirebaseApp。我的主要目的是使用来自 firebase 的手机身份验证,我已在 firebase 控制台中启用它。
我做过的事情-
应用级 Gradle
//apply plugin: 'kotlin-android'
apply plugin: 'com.android.application'
apply plugin: 'androidx.navigation.safeargs'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.ajoobee.mm"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//noinspection GradleCompatible
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.navigation:navigation-fragment:2.0.0-rc02'
implementation 'androidx.navigation:navigation-ui:2.0.0-rc02'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
//add kotlin
/* implementation "androidx.core:core-ktx:1.0.1"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"*/
implementation "com.github.leonardoxh:retrofit2-livedata-adapter:1.1.2"
//Internet Checker
implementation 'com.treebo:internetavailabilitychecker:1.0.2'
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.11.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
//Android Jetpack
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.1.0'
// implementation "android.arch.lifecycle:extensions:1.1.1"
//ButterKnife
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
//Dagger implementation 'com.google.dagger:dagger-android:2.17'
implementation 'com.google.dagger:dagger-android-support:2.17'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.17'
/* Dagger2 - default dependency */
annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
//circle image view
implementation 'de.hdodenhof:circleimageview:3.0.1'
//room database
implementation 'androidx.room:room-runtime:2.1.0'
annotationProcessor 'androidx.room:room-compiler:2.1.0'
implementation 'com.jakewharton.timber:timber:4.7.1'
//ImagePicker and Glide
implementation group: 'com.zhihu.android', name: 'matisse', version: '0.5.2'
implementation 'com.github.bumptech.glide:glide:4.9.0'
//SummerNote
implementation 'in.nashapp.androidsummernote:androidsummernote:1.0.5'
//uCrop
implementation 'com.github.yalantis:ucrop:2.2.4-native'
//roundedImageView
implementation 'com.makeramen:roundedimageview:2.3.0'
//progressBarChart
implementation 'com.ramijemli.percentagechartview:percentagechartview:0.3.1'
//googleLocation
implementation "com.google.android.gms:play-services-location:17.0.0"
implementation 'com.google.android.libraries.places:places:2.0.0'
//implementation project(':multiselectspinner')
implementation 'com.droidninja:filepicker:2.2.1'
//firebase
implementation 'com.google.firebase:firebase-auth:19.1.0'
implementation 'com.google.android.gms:play-services-auth:17.0.0'
}
apply plugin: 'com.google.gms.google-services'
我的项目级Gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
//ext.kotlin_version = '1.3.30'
repositories {
google()
jcenter()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.30"
classpath 'com.android.tools.build:gradle:3.5.1'
classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0'
classpath 'androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0'
classpath 'com.google.gms:google-services:4.3.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
google()
maven { url "https://jitpack.io" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
我的 fragment
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.navigation.NavOptions;
import androidx.navigation.Navigation;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.UnderlineSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.ajoobee.mm.Constants;
import com.ajoobee.mm.Data.Network.Response.ServerResult;
import com.ajoobee.mm.Data.Network.Retrofit.AuthenticationInterceptor;
import com.ajoobee.mm.Employer.UI.Home.Profile.PopUpWindow.CityPopUpWindow;
import com.ajoobee.mm.Employer.UI.Home.Profile.UpdateCompanyViewModel;
import com.ajoobee.mm.JobSeeker.UI.Home.Profile.JobSeekerProfileViewModel;
import com.ajoobee.mm.R;
import com.ajoobee.mm.Util.ErrorDialog;
import com.ajoobee.mm.Util.Util;
import com.ajoobee.mm.ViewModelFactory;
import com.ajoobee.mm.databinding.JobseekerFragmentRegisterBinding;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseException;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.PhoneAuthCredential;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.gson.JsonObject;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import dagger.android.support.AndroidSupportInjection;
public class JobSeekerRegisterFragment extends Fragment {
private JobseekerFragmentRegisterBinding binding;
private JobSeekerProfileViewModel jobSeekerProfileViewModel;
private UpdateCompanyViewModel updateCompanyViewModel;
private CityPopUpWindow cityPopUpWindow;
private int city;
private boolean first = true;
private ErrorDialog errorDialog;
@Inject
ViewModelFactory viewModelFactory;
@Inject
AuthenticationInterceptor authenticationInterceptor;
private FirebaseAuth mAuth;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.jobseeker_fragment_register, container, false);
init();
if(this.getContext() != null){
FirebaseApp.initializeApp(this.getContext());
mAuth = FirebaseAuth.getInstance();
}
return binding.getRoot();
}
@Override
public void onStart() {
super.onStart();
FirebaseUser firebaseUser = mAuth.getCurrentUser();
if(firebaseUser != null){
Toast.makeText(this.getContext(), "Already Sign in ", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this.getContext(), "mAuth Still null ", Toast.LENGTH_SHORT).show();
}
}
private void init() {
if (this.getActivity() != null) {
if (this.getActivity().getIntent() != null) {
Intent intent = this.getActivity().getIntent();
if (intent.getBooleanExtra(Constants.LOGIN, false)) {
NavOptions navOptions = new NavOptions.Builder()
.setPopUpTo(R.id.jobSeekerEmailVeriRequiredFragment, true)
.build();
Navigation.findNavController(JobSeekerRegisterFragment.this.getActivity(), R.id.fragment).navigate(R.id.jobSeekerEmailVeriRequiredFragment, new Bundle(), navOptions);
}
}
}
if (this.getContext() != null) {
errorDialog = new ErrorDialog(this.getContext(), new ErrorDialog.OkButtonClick() {
@Override
public void onOkClick() {
}
});
binding.txtCity.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
if (first) {
cityPopUpWindow = new CityPopUpWindow(this.getContext(), binding.txtCity, city, id -> {
city = id;
cityPopUpWindow.dismiss();
cityPopUpWindow.opened = false;
binding.dropDownImageView.animate().rotation(0).start();
});
first = false;
}
});
jobSeekerProfileViewModel = ViewModelProviders.of(this, viewModelFactory).get(JobSeekerProfileViewModel.class);
updateCompanyViewModel = ViewModelProviders.of(this, viewModelFactory).get(UpdateCompanyViewModel.class);
//ClickableSpan
SpannableString spannableString = new SpannableString(getString(R.string.jobseeker_signup_already_account));
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Intent intent = new Intent(getActivity(), JobSeekerLogin.class);
JobSeekerRegisterFragment.this.startActivity(intent);
}
};
spannableString.setSpan(clickableSpan, 25, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.activeControlColor)), 25, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new UnderlineSpan(), 0, spannableString.length(), 0);
binding.alreadyHaveAccountTextView.setText(spannableString);
binding.alreadyHaveAccountTextView.setMovementMethod(LinkMovementMethod.getInstance());
binding.alreadyHaveAccountTextView.setHighlightColor(Color.TRANSPARENT);
//ClickableSpan
//ClickListener
binding.txtCity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cityPopUpWindow.show();
if (cityPopUpWindow.opened) {
binding.dropDownImageView.animate().rotation(180).start();
} else {
binding.dropDownImageView.animate().rotation(0).start();
}
}
});
binding.btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// if (CheckCondition()) {
// sendToRegister();
// }
getVerificationCode();
}
});
//ClickListener
//City
updateCompanyViewModel.Api_City();
updateCompanyViewModel.observeCity().observe(this, listServerResult -> {
if (listServerResult != null) {
if (listServerResult.getResponse().getCode().equals("200")) {
if (cityPopUpWindow != null) {
if (cityPopUpWindow.cityPopUpAdapter != null) {
cityPopUpWindow.cityPopUpAdapter.addCity(listServerResult.getResult());
cityPopUpWindow.cityPopUpAdapter.notifyDataSetChanged();
}
}
}
}
});
//City
//Registration
jobSeekerProfileViewModel.observeRegistration().observe(this, new Observer<ServerResult<JsonObject>>() {
@Override
public void onChanged(ServerResult<JsonObject> jsonObjectServerResult) {
if (jsonObjectServerResult != null) {
if (jsonObjectServerResult.getResponse().getCode().equals("200")) {
if (jsonObjectServerResult.getResult() != null) {
if (jsonObjectServerResult.getResult().size() > 0) {
JsonObject jsonObject = jsonObjectServerResult.getResult().get(0);
if (JobSeekerRegisterFragment.this.getActivity() != null) {
authenticationInterceptor.tokenId = jsonObject.get("token").getAsString();
Navigation.findNavController(JobSeekerRegisterFragment.this.getActivity(), R.id.fragment).navigate(R.id.action_jobSeekerRegisterFragment_to_jobSeekerEmailVerificationFragment);
}
}
}
} else {
errorDialog.updateTitleAndShow(jsonObjectServerResult.getResponse().getMessage());
}
}
}
});
//Registration
}
}
private boolean CheckCondition() {
if (this.getContext() != null) {
if (Util.checkConnection(this.getContext())) {
if (binding.txtContactInfoEmail.getText().toString().isEmpty()) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_missing_email_or_phone));
return false;
} else {
if (!Util.checkEmail(binding.txtContactInfoEmail.getText().toString())) {
if (!Util.checkPhoneNumber(binding.txtContactInfoEmail.getText().toString())) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_missing_email_phone_valid));
return false;
}
}
}
if (binding.txtFullName.getText().toString().isEmpty()) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_missing_full_name));
return false;
}
if (binding.txtPasword.getText().toString().isEmpty()) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_missing_password));
return false;
} else {
if (binding.txtPasword.getText().toString().length() < 6 || !Util.checkPassword(binding.txtPasword.getText().toString())) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_password_character));
return false;
}
}
if (binding.txtConfirmPassword.getText().toString().isEmpty()) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_confirm_password));
return false;
}
if (binding.txtCity.getText().toString().isEmpty()) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_missing_location));
return false;
}
if (!binding.txtPasword.getText().toString().equals(binding.txtConfirmPassword.getText().toString())) {
errorDialog.updateTitleAndShow(getString(R.string.signup_error_missing_password_match));
return false;
}
return true;
} else {
errorDialog.updateTitleAndShow(getResources().getString(R.string.no_internet_connection));
return false;
}
} else {
return false;
}
}
private void getVerificationCode() {
if(mAuth != null){
PhoneAuthProvider.getInstance(mAuth).verifyPhoneNumber(
"09798423585", // Phone number to verify
60, // Timeout duration
TimeUnit.SECONDS, // Unit of timeout
this.getActivity(), // Activity (for callback binding)
new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
Toast.makeText(getContext(), "Verification Completed", Toast.LENGTH_SHORT).show();
}
@Override
public void onVerificationFailed(@NonNull FirebaseException e) {
Toast.makeText(getContext(), "Verification failed", Toast.LENGTH_SHORT).show();
}
});
}
}
private void sendToRegister() {
com.ajoobee.mm.Data.Obj.JobSeeker.JobSeekerRegister jobSeekerRegister = new com.ajoobee.mm.Data.Obj.JobSeeker.JobSeekerRegister(
binding.txtFullName.getText().toString(),
binding.txtPasword.getText().toString(),
binding.txtContactInfoEmail.getText().toString(),
"",
"",
"",
"1",
""
);
if (this.getActivity() != null) {
((JobSeekerRegisterActivity) this.getActivity()).email = binding.txtContactInfoEmail.getText().toString();
}
jobSeekerProfileViewModel.Api_JobSeekerRegistration(jobSeekerRegister);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
AndroidSupportInjection.inject(this);
}
}
错误信息
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.auth.FirebaseUser com.google.firebase.auth.FirebaseAuth.getCurrentUser()' on a null object reference
你可以看到我试图让当前用户 onStart 功能,但它曾经失败过。我调试了每一行,mAuth 始终为空。
最佳答案
终于找到答案了,原来是因为
tools:node="replace"
在 list 中。只需将其删除即可正常工作。
关于android - FirebaseAuth.getInstance() 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58496920/
所以我有一个 onAuthStateChanged 流,我想检查用户是否已被 Firebase 控制台上的管理员禁用以注销用户并再次转到登录页面,这是我的流检查用户是否已登录,但如何检查用户是否被 F
当我尝试注册时,它说注册失败。这是经过一些调整后的代码更新版本。我尝试分析代码,但没有成功。 包 com.brandshopping.brandshopping; import androidx.an
我的代码中的 FirebaseAuth.getInstance 返回 null,这导致我的应用无法运行。这是我的主要内容: public class MainActivity extends AppC
我刚开始编写一个新的 Xcode 项目,我使用 FirebaseAuth 进行登录/注销,问题是当我尝试正常登录用户时,你会使用它 Auth.auth().signIn(withEmail: emai
我正在开发一个应用程序,该应用程序使用 Firebase 身份验证通过电话号码登录用户。我想添加一项功能,使用户只能登录一次,即即使用户终止应用程序并再次启动它,他也应该登录。另外,我不想添加注销功能
为什么会出现此错误?我的存储库和 Google Play 服务是最新的,我已经使用了使用 Firebase 所需的所有步骤,例如在 build.gradle(项目和应用程序)中复制 firebase
我在我的应用程序中使用 facebook 登录。用户登录后,我可以获得他们的基本 Facebook 信息,例如显示名称、电子邮件和照片 url。我想得到他们的 facebook 好友列表。我想我可以用
我有一个社交媒体应用,我使用 FirebaseUI 让用户使用电子邮件、Google 或 Facebook 登录/注册该应用。 如果使用“电子邮件”作为密码,如何让用户稍后更改其密码提供商? 如果使用
我在我的应用程序中有一个带有重定向的 Google 身份验证,我想在身份验证完全完成后进行重定向。 但是 promise 没有用 function loginGoogle() { v
我希望在我的应用中的用户状态发生变化时收到通知。我的意思是,当它刚刚登录和刚刚注销时。我不想在刷新用户 token 或每次应用程序启动并且用户自动登录时收到通知。 我正在使用预期的处理程序: Fire
我正在制作一个包含登录系统的系统,登录后我们进入主要 Activity ,那里有一个抽屉导航 Activity 。之前,当我开始时,我的登录系统运行得很好,但我有一个空的主要 Activity ,只有
我安装了我需要的所有 pod,但 Xcode 显示错误“没有这样的模块 FirebaseAuth”,我尝试了这个,发现: Shift+Command+K 清理工作区 我在终端中重新安装了 podfil
我试图在 Flutter 中获取用户的登录状态,每当我第一次运行我的应用程序时(仅当我卸载并重新安装该应用程序时),以下代码返回一个用户。 我已经尝试让用户从 whenComplete 和 then
From the docs : 管理员用户管理 API 使您能够在安全的服务器环境中以编程方式完成以下任务: 构建针对特定用户量身定制的自定义用户控制台应用程序的用户管理系统。 这是否意味着我可以将自
我有一个使用 Facebook 身份验证登录的应用程序。当加载入职屏幕时,我检查用户是否已经通过身份验证,如果他们使用以下代码,则执行转至主屏幕: override func viewDidLoad(
我正在使用 Firebase 的身份验证服务,它可以正常工作,但我不知道如何处理 createUserWithEmailAndPassword() 的错误代码,例如 auth/email-alread
我将我的 Firebase signInWithEmailAndPassword() 方法从我的登录 Activity 中移到了一个单独的网络包/类中。我已使用 createUserWithEmail
在我的应用程序中,我们只有用于登录的电话号码验证。这对用户来说是完美的,但在测试应用程序时开始变得有点痛苦。 存在多个问题: 电话号码验证仅适用于实体设备。 多次登录会导致接收带有验证码的短信出现较大
将 Firebase 身份验证集成到我的应用中。一切似乎都很好,直到我注意到我打开应用程序时出现的问题,它显示登录屏幕,即使已经有用户登录。 退出应用程序并再次启动它解决了问题(应用程序不再要求用户重
我有一个 DispatchActivity 作为我的 Launcher Activity,用于检查当前是否有用户登录。如果用户已登录,我将他们发送到他们的 ProfileActivity。否则,我将它
我是一名优秀的程序员,十分优秀!