谷歌登录可以在模拟器中使用,但不能在手机中使用

2024-03-28

我在使用 Firebase 实施 Google 登录时遇到了非常严重的问题。 我可以使用我的模拟器 Android 7.0(为 x86_64 构建的 SDK)登录, 但如果我将项目上传到手机(Android 6.0),我将无法使用 Google 登录。 我唯一看到的是应用程序关闭。在极少数情况下,如果我快速双击登录按钮,它将登录,但不会获得进一步使用的凭据。 可能是什么问题?

LoginActivity中的代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == FirebaseConstants.LOG_IN_REQUEST){

        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        Intent i = new Intent(LoginActivity.this, MainActivity.class);
        startActivity(i);

    }
    if(requestCode == FirebaseConstants.LOG_OUT_REQUEST){
        TastyToast.makeText(this, "Logged out successfully", TastyToast.LENGTH_LONG, TastyToast.SUCCESS);
    }
}

这是 onCreate 方法中的代码(单击按钮):

    btnGoogleSignIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(NetworkUtil.isNetworkAvailable(LoginActivity.this)){
                googleLogin.logIn(LoginActivity.this);
            }else{
                TastyToast.makeText(LoginActivity.this, "Network is unavailable", TastyToast.LENGTH_LONG, TastyToast.ERROR);
            }
        }
    });

谷歌登录实例

    public class GoogleLogin extends Observable implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{

        private final GoogleApiClient googleApiClient;
        private final WeakReference<Activity> activityWeakReference;
        private static GoogleLogin googleLogin;

        public GoogleLogin(final Activity activity) {
            activityWeakReference = new WeakReference<>(activity);
            // Configure Google Sign In
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(activity.getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
            googleApiClient = new GoogleApiClient.Builder(activity)
                    .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                    .build();
        }

        @Override
        public void onConnected(@Nullable Bundle bundle) {
        }

        @Override
        public void onConnectionSuspended(int i) {

        }

        @Override
        public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        }

        public static GoogleLogin getInstance(Activity activity) {
            if (null == googleLogin) {
                googleLogin = new GoogleLogin(activity);
            }

            return googleLogin;
        }


        public void logIn(Activity activity){
            Context c = activityWeakReference.get().getApplicationContext();
            googleApiClient.connect();
            if(googleApiClient.isConnected()){
                Intent i = new Intent(c, MainActivity.class);
                googleApiClient.connect();
                activity.startActivity(i); // this wont start an activity
            }else if(!googleApiClient.isConnected()){
                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
                googleApiClient.connect();
// this wont start an activity either
                activity.startActivityForResult(signInIntent, FirebaseConstants.LOG_IN_REQUEST);



            }
        }

        public void signOut(final Activity activity){
            if(googleApiClient.isConnected()) {
                Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                        new ResultCallback<Status>() {
                            @Override
                            public void onResult(Status status) {
                                Intent i = new Intent(activity, LoginActivity.class);
                                activity.startActivityForResult(i, FirebaseConstants.LOG_OUT_REQUEST);
                            }
                        });
            }
        }

        public void disconnect(Activity activity){
            activity.getApplicationContext();
            if(googleApiClient.isConnected()){
                googleApiClient.disconnect();
                Intent i = new Intent(activity, LoginActivity.class);
            }
        }


    }

没有你们的帮助,我无法解决这个问题。我真的需要让它发挥作用!

build.gradle 中的依赖项

compile 'com.google.firebase:firebase-messaging:9.6.1'
compile 'com.google.firebase:firebase-database:9.6.1'
compile 'com.google.firebase:firebase-core:9.6.1'
compile 'com.google.firebase:firebase-auth:9.6.1'
compile 'com.google.android.gms:play-services-auth:9.6.1'
compile 'com.google.firebase:firebase-ads:9.6.1'

在 build.gradle 的底部

apply plugin: 'com.google.gms.google-services'

如果您的调试版本在使用 Google Sign-in 登录 Firebase 时没有抛出任何错误,则可能是证书签名问题。

Step 1(选修的)

在所有 catch 块中创建一条 Toast 消息,以便您可以看到错误代码是什么。正常构建并签署您的应用程序;然后将其作为封闭或开放轨道发布以进行测试。在线搜索错误代码。 (不要依赖通用状态代码 https://developers.google.com/android/reference/com/google/android/gms/common/api/CommonStatusCodes仅描述,并搜索其他资源)。

Step 2

检查您发布的 apk/bundle 的 SHA-1 证书指纹是什么:

A) 转到 Android Studio 中的 Gradle/:app/Tasks/android/signingReport 并生成报告。从发布版本复制 SHA1 指纹。

B) 如果您的应用程序由 Google Play 签名,则转到 Google Play 控制台中的发布管理/应用程序签名,并从应用程序登录证书复制 SHA-1 证书指纹

然后转到 Firebase 控制台中的“项目设置”并添加新指纹,以便您同时获得调试和发布指纹。

Step 3

下载 google-services.json 文件并将构建中的现有文件替换为您刚刚下载的文件。构建并签署新版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谷歌登录可以在模拟器中使用,但不能在手机中使用 的相关文章

  • 如何在我的应用程序上为所有手机调用 Android 计算器

    public static final String CALCULATOR PACKAGE com android calculator2 public static final String CALCULATOR CLASS com an
  • 小部件预览图像

    My app preview image looks like this 我怎样才能让它看起来像 WhatsApp 聊天预览 小有阴影 我手机中的其他应用程序也使用相同类型的预览 我的小部件 xml
  • Android Volley StringRequest 有时不工作

    我使用下面的代码从 API 获取一些本地视频 URL public void getVideoAds String serverURL String url http serverURL video StringRequest string
  • 如何更改 Android 设备上的 MAC 地址? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有没有一种简单的方法可以手动更改 A
  • AppBarLayout 滚动时 RecyclerView fling 导致延迟

    我的布局如下
  • 如何保留操作/标题栏但隐藏通知栏

    如何保留操作 标题栏但隐藏通知栏 这个问题看起来已经得到了回答 但我发现的大多数答案都隐藏了操作栏和通知栏 我希望能够保留操作 标题栏 我得到的最好的方法是隐藏两者并使用线性布局来显示自定义操作 标题栏 但我想要一个系统生成的 另外 是否可
  • 小米Exif方向标签错误

    我在用着ExifInterface对于通过检测方向标签从图库中选取的旋转图像 它正在工作 最近我在小米9 SE上测试了应用程序 发现相机拍摄的照片有方向标签8 旋转270 但照片方向是正确的 不需要旋转 为什么方向标签错误 如何找到正确的旋
  • 推送通知不会弹出带有入门套件的react-native-firebase

    我已经克隆了React Native Firebase 启动器 https github com invertase react native firebase starter并进行了初始设置 然后根据文档重命名项目 然后添加google
  • Firebase 重置密码 Swift [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道你们是否可以向我展示如何在 Swift 中设置重置密码 我目前正在使用 Firebase 作为我的后端服务 我只需要代码 答案
  • 在android中启动基于文件的Activity

    我正在开发一个应用程序 它列出文件夹中的文件 在 ListView 中 当用户单击其中一个项目时 如果它是一个文件 那么我想启动一个可以处理它的活动 如果有的话 或者如果没有则显示某种错误消息 我怎样才能做到这一点 当然 这不是全部 但我如
  • 如何在ubuntu服务器上安装android SDK

    我在 ubuntu 服务器中有一个 React Native 项目 我想构建一个用于生产的 Android 应用程序 为此 我首先必须生成 Gradle Wrapper 文件 因此我在中运行此命令android目录 gradle wrapp
  • 使用正则表达式解析HLS m3u8文件

    我想解析 HLS master m3u8 文件并从中获取带宽 分辨率和文件名 目前我正在使用字符串解析来搜索字符串中的某些模式并执行子字符串来获取值 示例文件 EXTM3U EXT X STREAM INF PROGRAM ID 1 BAN
  • Android JSoup 示例

    我只是想知道是否有人有一个包含 JSoup 的工作实现的示例 Eclipse 项目 我试图用它从网站上获取信息 并在谷歌上到处搜索试图让它工作 但不能 如果有人可以提供帮助 我将非常感激 JSoup 真的很容易使用 看看 JSoup 食谱中
  • 需要新版本后 Firebase 参考为空

    The new 文档 https firebase google com docs database server start authenticate with admin privileges提供了一种初始化 firebase 的简单方
  • 如何在 Android 应用程序中显示日历 UI? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我的应用程序中使用日历 如下图所示 我希望在我的活动中使用此日历 UI 我怎样才能做到这一点 呵呵 我们之前已经这样做过 请参阅
  • 自定义 lint 规则,确保不调用特定方法

    我想确保在我的 Android 应用程序 Java 和 Kotlin 代码中 中不会调用特定类的特定方法 假设 我有一个名为Bar有两种方法 allowed and disallowed 这是代码 package com public cl
  • Android 每个 Activity 中的通用进度条

    我已经修改了解决方案 我可以获得进度条 但进度条永远不会隐藏 这是创建具有相对布局的进度条的类 public class ProgressBarHandler private ProgressBar mProgressBar private
  • public open fun navigateUp() 的参数太多

    我在 Kotlin 中创建了一个新的 Android 项目 我还使用向导创建了一个新的导航抽屉活动 一如既往 没有任何东西是开箱即用的 以下行显示编译错误 val navController findNavController R id n
  • 仅使用 google-signin 获取电子邮件

    我正在使用来自的谷歌登录示例https developers google com identity sign in web https developers google com identity sign in web 下面粘贴的代码供
  • Android:自动重新连接 BLE 设备

    我的目标是让 Android 设备重新连接到之前连接过的 BLE 设备无需用户干预与经典 BT 配对设备的操作方式相同 甚至可以通过电源循环工作 BTLE 设备的想法之一是节省服务 绑定和启用状态 以便重新连接非常快并且在外设上消耗很少的功

随机推荐

  • asp.net Base-64 字符串中的无效字符

    我有一个 C 移动网站 并且在使用某些移动客户端时遇到问题 我在下面发布了一条跟踪 但基本上是手机浏览器或手机连接到互联网 url 的 wap 网关对表单中的视图状态隐藏输入进行编码 wEPDwULLTExNTMyOTcwOTBkGAEFB
  • 在 ASP Web API 中指定无效参数时返回错误

    我正在使用 C 和 ASP NET Web API 创建一个 API 并且希望它在使用无法识别的参数时返回错误 例如 api Events 应该有一个事件列表 api Events startTime startTime 应该返回在特定时间
  • “wordlist”的非数字第二个参数

    我正在 Eclipse android 中构建一个 c 项目并收到以下错误 这是 ndk 构建错误 与我的代码无关 Users eladb MyWorkspace android ndk r8e build gmsl gmsl 512 no
  • 获取pandas数据框中子节点的所有直接中间和最终父节点

    我的数据框具有父子关系 如下所示 child Parent relationship A1x2 bc11 direct parent bc11 Aw00 direct parent bc11 Aw00 ultimate parent Aee
  • 将 Flask 表单值转换为 int

    我有一个表格 其中发布了personIdint 到 Flask 然而 request form personId 返回一个字符串 为什么 Flask 不给我一个 int 我尝试将其转换为 int 但下面的路线返回 400 或 500 错误
  • jQuery 选择器上下文问题

    我试图做出以下选择 program row 其中 row 是包含两个表行的 jQuery 对象 其中一个 tr 具有 program 类 该选择器似乎没有找到它 但是以下方法有效 title row 其中 div title 是 tr pr
  • 使用CSS的圆形文本段落[重复]

    这个问题在这里已经有答案了 我一直在寻找一个关于如何将一段文本放置在圆圈内的体面且快速的解决方案 我发现有两种解决方案 解决方案1 浮动倍数div与文本左侧和右侧的文本高度相同 并通过更改 divwidth您可以调整文本的剩余空间 解决方案
  • SpriteKit和粒子碰撞

    我有一个粒子发射器 我想在粒子碰撞某些物理体时检测到它 SpriteKit API 中是否有本地方法可以做到这一点 或者我是否需要 作弊 单个粒子不能碰撞 不是用物理学 也不是任何其他方式 您甚至无法获得有关单个粒子的任何信息 您无法访问它
  • 2个脚本(FitVids.js、Vimeo.js)一起kill调用函数播放视频,导致:VimeoAPI不是函数

    Update以下 好吧 我这里遇到了问题 我使用这个优秀的 vimeo 类来让我的生活更轻松 http www josh ho com vimeo class http www josh ho com vimeo class 源代码在这里
  • GitHub Actions:在可重用工作流程中引用环境机密

    我已经能够在可重用工作流程中传递和引用组织和存储库机密 没有任何问题 问题 错误 是环境特定的秘密没有被传递 我尝试明确并列出所有这些并使用 秘密 继承 如果我使用 秘密 继承 我不必显式列出任何秘密 但是 引用时环境秘密为空 将它们全部列
  • 带有静态单元格的 UITableView 不会出现

    我使用 Storyboards 选项卡视图模板 创建了一个新的 Xcode 项目 我在故事板中添加了几个视图控制器 并希望使用带有静态单元格的 UITableView 我创建了它 但是当我在模拟器中运行时 单元格不会出现 除了这个故事板文件
  • Shinydashboard:Google 地点自动完成。 InvalidValueError:不是 HTMLInputElement 的实例

    我想放一个shinydashboard在一起 并有一个 Google Places 搜索框作为文本输入 下面的代码以常规方式运行shiny页面 但抛出一个InvalidValueError not an instance of HTMLIn
  • InnoDB:发现重复索引 - 这很糟糕吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 最近我们的 Magento 商店变得非常慢 我们真的不知道为什么 就在今天 我在检查数据库时注意到超过 900 个索引是相同的重复项 即存在两个 我的
  • 首次启动时无法识别 iCloud 键值存储

    我的应用程序使用 iCloud 键值存储 在多个设备之间同步唯一 ID 在应用程序首次启动时 如果它确实必须工作 那么就可以接受 看起来设备在首次启动时还不熟悉 iCloud 的值 只有在应用程序安装并运行一段时间后才熟悉 我在应用程序主视
  • Java:生成具有透明度的缩略图

    我在生成具有 Alpha 通道 透明度 的图像缩略图时遇到问题 我使用的代码是这样的 public void saveThumbnail File file String imageType if bufferedThumb null re
  • 上传错误 - 无法将 apk 文件上传到 Google Play 开发者控制台?

    我在 Google Play 上有一些应用程序已经有一段时间了 但我已经几个月没有发送更新了 现在我尝试发送更新 但在上传 apk 文件时出现上传错误 我尝试过使用另一个应用程序和另一台计算机 但出现了同样的错误 过去 5 天我一直在尝试解
  • 根据所选父节点显示子节点

    嗨 我一直在寻找这个问题的答案 但找不到答案 我只有 3 个月的使用 python django 经验 所以请原谅我的虚拟问题 我使用 django mptt 来显示一个简单的嵌套集导航 ul class root recursetree
  • 使用 LINQ 实体框架的 LEFT JOIN 或 RIGHT JOIN

    尝试使用 Linq 加入 我应该用什么 左连接还是右连接 APPLICANT TABLE PROFILE TABLE APPLICANT ID profile id Applicant Name profile id Applicant N
  • git 空格问题

    空白冲突很糟糕 空白最终对我来说是一种可怕的痛苦 在使用 git 时 git config apply whitespace strip 似乎增加了你发生冲突的机会 当你脱掉 不需要的空白 然后其他合作者会看到被剥离的空白 空格作为他们提交
  • 谷歌登录可以在模拟器中使用,但不能在手机中使用

    我在使用 Firebase 实施 Google 登录时遇到了非常严重的问题 我可以使用我的模拟器 Android 7 0 为 x86 64 构建的 SDK 登录 但如果我将项目上传到手机 Android 6 0 我将无法使用 Google