每当我试图通过启动google登录意图登录时,它都会直接进入onActivityResult,而我没有机会选择帐户。它所做的只是将屏幕变暗,但选择帐户的窗口不会出现。然后登录失败,出现以下异常:
java.lang.ClassNotFoundException: com.google.android.gms.common.api.Scope
和
java.lang.RuntimeException: Canvas: trying to draw too large(256000000bytes) bitmap.
(完整堆栈跟踪:https://pastebin.com/vBZeBLu0)
我使用的所有依赖项都是最新的,我的凭据(oAuth客户端id)都设置正确,我尝试了其他类似问题的解决方案,但没有一个解决了我的问题,我还检查了用户是否完全从设备注销,问题是否一直存在。
这是我的登录活动:
public class Login extends Activity implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {
private static final String TAG = "LoginProcess";
SignInButton gsignInButton;
private static final int RC_SIGN_IN = 1;
DatabaseReference mRef;
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
GoogleSignInOptions gso;
GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcomescreenlogin);
mAuth = FirebaseAuth.getInstance();
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
gsignInButton = findViewById(R.id.sib);
gsignInButton.setColorScheme(SignInButton.COLOR_DARK); // wide button style
gsignInButton.setOnClickListener(myhandler);
}
View.OnClickListener myhandler = new View.OnClickListener() {
public void onClick(View v) {
signIn();
}
};
public void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
firebaseAuthWithGoogle(account);
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.w(TAG, "Google sign in failed", e); //this is where it always lands.
Toast.makeText(this, "login failed", Toast.LENGTH_SHORT).show();
// ...
}
}
}
登录活动的完整代码:https://pastebin.com/6Yi7vzD7
Gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "com.example.sanchez.worldgramproject"
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
versionCode 0
versionName "0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
api "com.google.android.material:material:1.0.0"
implementation 'com.github.madrapps:pikolo:1.1.6'
implementation 'com.google.android.gms:play-services-drive:16.0.0'
implementation 'com.google.android.material:material:1.1.0-alpha02'
implementation 'com.github.bumptech.glide:glide:3.8.0'
implementation'com.firebaseui:firebase-ui-storage:2.3.0'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.google.android.gms:play-services-auth:16.0.1'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.jakewharton:butterknife:8.8.1'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
implementation 'de.hdodenhof:circleimageview:2.2.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.exifinterface:exifinterface:1.0.0'
implementation 'com.google.firebase:firebase-storage:16.0.5'
implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'com.google.firebase:firebase-database:16.0.5'
testImplementation 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'
我不知道问题的原因是什么,我怎么才能解决这个问题,使帐户选择窗口弹出?
编辑2.1.2019
与上面的ApiExeption不同,我得到了以下错误:
W/LoginProcess: Google sign in failed
com.google.android.gms.common.api.ApiException: 8:
at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source:4)
at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source:8)
at com.example.sanchez.worldgramproject.Login.onActivityResult(Login.java:162)
at android.app.Activity.dispatchActivityResult(Activity.java:7548)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4485)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4532)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1752)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
我相信我设置oAuth(由Firebase自动生成)的方式出了问题
正如所料,这是由于
画布:试图绘制太大(256000000字节)的位图。
您使用的启动器图标也出现在“帐户选择器”对话框中,它阻止对话框弹出
作为一种解决方案,您可以按照Praveen的回答(选项2)让应用程序支持Manifest
中的较大图像
但我建议您压缩图像文件,因为account chooser对话框实际上不需要高分辨率图像,而且启动器图标也不需要那么大。看看这个,将启动器图标缩放到那些大小(仅限于您需要的大小),并将它们放在各自的可绘制文件夹中,这样也可以帮助您避免将来出现类似问题。
选项1-确保在Firebase控制台的Firebase身份验证方法中启用Google登录。默认情况下,谷歌登录未启用。
选项2——在你的AndroidManifest中。xml文件,在标签下添加以下行以支持高内存支持,以防Google登录弹出窗口需要更多内存。在本例中,甚至可以在应用程序标记-largeHeap as true~您的启动器映像中使用此命令加载大型映像。
<application
android:hardwareAccelerated="true"
android:largeHeap="true" >
选项3——尝试使用Firebase实现Google登录,它应该可以工作。
public class LoginActivity extends AppCompatActivity {
private GoogleSignInClient mGoogleSignInClient;
private FirebaseAuth mAuth;
private int permissions = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
SignInButton authButton = findViewById(R.id.home_auth_button);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("xxxxxxxxxxxx.apps.googleusercontent.com").requestEmail().build();
mAuth = FirebaseAuth.getInstance();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
authButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn();
}
});
}
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, 0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
if (account != null) {
firebaseAuthWithGoogle(account);
} else{
Log.w("AUTH", "Account is NULL");
Toast.makeText(LoginActivity.this, "Sign-in failed, try again later.", Toast.LENGTH_LONG).show();
}
} catch (ApiException e) {
Log.w("AUTH", "Google sign in failed", e);
Toast.makeText(LoginActivity.this, "Sign-in failed, try again later.", Toast.LENGTH_LONG).show();
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d("AUTH", "firebaseAuthWithGoogle:" + acct.getId());
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d("AUTH", "signInWithCredential:success");
startActivity(new Intent(LoginActivity.this, AnotherActivity.class));
Toast.makeText(LoginActivity.this, "Sign-in successful!", Toast.LENGTH_LONG).show();
} else {
Log.w("AUTH", "signInWithCredential:failure", task.getException());
Toast.makeText(LoginActivity.this, "Sign-in failed, try again later.", Toast.LENGTH_LONG).show();
}
}
});
}
}
注意谷歌的签名。生成器,您需要向生成器传递requestIdToken(“xxxx”)。这是一个URL,您可以在Firebase身份验证选项卡下找到它-
希望这能回答你的问题。
我已经尝试了这里提到的许多解决方案,但我仍然无法解决这个问题。我收到: “Google登录失败。com.google.android.gms.common.api.apiException:10” 下面是我的代码: 附言。我也在同一个项目中使用Firestore数据库。我已经成功地将google-services.json保存在应用程序的文件夹中。
我在尝试调用此方法时遇到以下异常。 MessageQueue回调中出现异常:HandlerReceiveCallback 08-21 00:12:43.454 10843-10843/common。以货换货通用域名格式。barterapp E/MessageQueue JNI﹕ Android看法膨胀异常:二进制XML文件行#2:在android上inflating类时出错。看法更平坦。com上的
所以我最初是想在我的应用程序中添加Firebase认证谷歌登录。当这没有奏效的时候,我决定尝试一下Firebase的官方Quickstart应用程序。我下载了它,导入到Android Studio,按照他们所有的方向去做。还是不行。 发生的是我点击“登录”按钮,一个对话框将出现在我选择我的个人资料,然后只是什么都没有。调试时,我发现方法返回false,我不知道该怎么做。 设备详细信息: > And
我正在使用javascript sdk来实现facebook登录。是否可以将用户重定向到完整的登录页面而不是显示弹出窗口?我尝试添加show:'page',但这似乎无济于事。 谢谢
我刚刚开始使用和开发应用程序的自动化框架。当我转到url时,会显示一个登录弹出窗口,询问凭据(用户名、密码)。 我已经能够在上处理这个问题,使用 但是,此解决方案对或不起作用。我也试过 而且 而这似乎也行不通。