草庐IT

android - Facebook 登录仅适用于 API 24 - 找不到 com.google.firebase.auth 的本地模块描述符类。错误

coder 2023-12-16 原文

我在我的应用程序上添加了带有 firebase 身份验证的 facebook 登录,但登录身份验证仅适用于 Android API 24。

当我尝试使用较低级别的 API 时,屏幕卡住并且应用程序停止工作。

它太高了,大多数用户都较低API level .

事实上,我打算发布适用于较低 API 级别的应用程序。

我使用的代码如下。

public class ConfigurationActivity extends Activity {

    Button b_v_mm,b_som;
    LoginButton loginButton;
    CallbackManager callbackManager;

    // [START declare_auth]
    private FirebaseAuth mAuth;
    // [END declare_auth]


    private void handleFacebookAccessToken(AccessToken token) {
        Log.d("FireBase", "handleFacebookAccessToken:" + token);

        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d("FireBase", "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            //updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w("FireBase", "signInWithCredential:failure", task.getException());
                            //Toast.makeText(FacebookLoginActivity.this, "Authentication failed.",
                             //       Toast.LENGTH_SHORT).show();
                            //updateUI(null);
                        }

                        // ...
                    }
                });
    }

    // [START on_start_check_user]
    @Override
    public void onStart() {
        super.onStart();
        Log.d("FireBase", "onStart");
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        //updateUI(currentUser);
    }
    // [END on_start_check_user]

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("LoginFace", "LoginFace - onActivityResult");
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("LoginFace", "LoginFace - onActivityResult");
        callbackManager.onActivityResult(requestCode, resultCode, data);
        Log.d("LoginFace", "LoginFace - After callbackManager");
/*
        if (AccessToken.getCurrentAccessToken() != null) {
            Log.d("AjudaFace", "AjudaFace - logout");
            LoginManager.getInstance().logOut();
        }*/
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_configuration);

        //Botãp da barra de ferramentas que faz retornar para o Menu principal.
        b_v_mm = (Button) findViewById(com.cerveja.qof.pedro.qof_cerveja.R.id.b_v_mm);
        b_v_mm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ConfigurationActivity.this, MainMenu.class);
                startActivity(intent);
                finish();
            }
        });

        b_som = (Button) findViewById(com.cerveja.qof.pedro.qof_cerveja.R.id.b_som);
        //Altera opções de som.
        b_som.setOnClickListener(new View.OnClickListener() {
                                      @Override
                                      public void onClick(View v) {

                                          //Carrega opções de texto do botão, armazenadas no repositório de strings
                                          String s_som_on = getString(R.string.b_som_on);
                                          String s_som_off = getString(R.string.b_som_off);

                                          //Caso o som esteja desligado, o desliga.
                                          if(b_som.getText().equals(s_som_on)) {
                                              b_som.setText(s_som_off);
                                          }
                                          else //Caso o som esteja desligado, o liga.
                                              if (b_som.getText().equals(s_som_off)){
                                                  b_som.setText(s_som_on);
                                              }
                                      }
                                  }
        );

        callbackManager = CallbackManager.Factory.create();


// ...
// Initialize Firebase Auth
        mAuth = FirebaseAuth.getInstance();

        loginButton = (LoginButton) findViewById(R.id.login_button);
        loginButton.setReadPermissions("email","public_profile");
        Log.d("LoginFace", "LoginFace - Button Created");


        // Callback registration
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                handleFacebookAccessToken(loginResult.getAccessToken());
                Log.d("LoginFace", "LoginFace - Sucesso");
                Toast.makeText(getApplicationContext(),
                        "LOGIN REALIZADO", Toast.LENGTH_LONG).show();
            }

            @Override
            public void onCancel() {
                Log.d("LoginFace", "LoginFace - Cancelado");
                Toast.makeText(getApplicationContext(),
                        "LOGIN CANCELADO", Toast.LENGTH_LONG).show();
            }


            @Override
            public void onError(FacebookException exception) {
                Log.d("LoginFace", "LoginFace - Erro");
                Toast.makeText(getApplicationContext(),
                        "LOGIN Erro", Toast.LENGTH_LONG).show();
                Log.d("LoginFace", exception.toString());
            }
        });


    }
}

MyApplication Activity 中使用的对象

import android.app.Application;
import android.content.Context;

**项目中使用的所有对象都在上面列出

API 23 日志:

12-02 17:22:26.900 2668-2745/? D/EGL_emulation: eglMakeCurrent: 0xaa9ba4e0: ver 2 0 (tinfo 0xac3853a0)

                                            [ 12-02 17:22:26.949  2668: 3361 D/         ]
                                            HostConnection::get() New Host Connection established 0xa19c5800, tid 3361


                                            [ 12-02 17:22:26.950  2668: 3361 W/         ]
                                            Unrecognized GLES max version string in extensions: ANDROID_EMU_CHECKSUM_HELPER_v1

ANDROID_EMU_dma_v1 12-02 17:22:26.977 2668-3361/? D/EGL_emulation: eglCreateContext: 0xaa9ba900: maj 2 min 0 rcv 2 12-02 17:22:26.978 2668-3361/? D/EGL_emulation: eglMakeCurrent: 0xaa9ba900: ver 2 0 (tinfo 0xa23bf7e0) 12-02 17:22:26.980 2668-3361/? E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf 12-02 17:22:26.980 2668-3361/? E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824 12-02 17:22:26.980 2668-3361/? E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf 12-02 17:22:26.980 2668-3361/? E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824 12-02 17:22:27.135 2668-3361/? D/EGL_emulation: eglCreateContext: 0xaa9ba9c0: maj 2 min 0 rcv 2 12-02 17:22:27.136 2668-3361/? D/EGL_emulation: eglMakeCurrent: 0xaa9ba9c0: ver 2 0 (tinfo 0xa23bf7e0) 12-02 17:22:29.740 2668-2668/com.cerveja.qof.pedro.qof_cerveja W/BindingManager: Cannot call determinedVisibility() - never saw a connection for the pid: 2668 12-02 17:22:32.649 2668-2745/com.cerveja.qof.pedro.qof_cerveja D/EGL_emulation: eglMakeCurrent: 0xaa9ba4e0: ver 2 0 (tinfo 0xac3853a0) 12-02 17:22:32.650 2668-2745/com.cerveja.qof.pedro.qof_cerveja E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb40bdc00 12-02 17:22:32.676 2668-3361/com.cerveja.qof.pedro.qof_cerveja D/EGL_emulation: eglMakeCurrent: 0xaa9ba900: ver 2 0 (tinfo 0xa23bf7e0) 12-02 17:22:32.687 2668-3361/com.cerveja.qof.pedro.qof_cerveja D/EGL_emulation: eglMakeCurrent: 0xaa9ba9c0: ver 2 0 (tinfo 0xa23bf7e0) 12-02 17:22:32.704 2668-2745/com.cerveja.qof.pedro.qof_cerveja D/EGL_emulation: eglMakeCurrent: 0xaa9ba4e0: ver 2 0 (tinfo 0xac3853a0) 12-02 17:22:32.716 2668-2745/com.cerveja.qof.pedro.qof_cerveja E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf 12-02 17:22:32.767 2668-3361/com.cerveja.qof.pedro.qof_cerveja D/EGL_emulation: eglMakeCurrent: 0xaa9ba900: ver 2 0 (tinfo 0xa23bf7e0) 12-02 17:27:05.115 2668-2711/com.cerveja.qof.pedro.qof_cerveja W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.

这最后一个可能是错误原因:

12-02 17:27:05.115 2668-2711/com.cerveja.qof.pedro.qof_cerveja W/DynamiteModule:找不到 com.google.firebase.auth 的本地模块描述符类。

如何降低所需的 API 级别?

最佳答案

尝试将您的客户端与您的 Firebase 应用程序重新同步,然后再次添加 .json 文件。

在 android studio 2.3 中,只需单击工具>firebase,然后在助手中检查您的应用是否已连接。

还要确保 facebook 开发者帐户和 firebase 控制台中的包名称都是正确的。

Use the latest Firebase library

你能检查一下你的 Google Play 服务版本吗?

Android 设备应具有 Google Play 服务 9.0.0 或更高版本

此问题的原因之一可能是您在 Firebase 中的登录方法 > 身份验证仪表板可能已被禁用

关于android - Facebook 登录仅适用于 API 24 - 找不到 com.google.firebase.auth 的本地模块描述符类。错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47579107/

有关android - Facebook 登录仅适用于 API 24 - 找不到 com.google.firebase.auth 的本地模块描述符类。错误的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  9. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

随机推荐