简体   繁体   English

使用Firebase的Android Facebook登录仅在某些设备上无法使用

[英]Android Facebook Login with Firebase does not work in some devices only mine

I've implemented Android Facebook Login With Firebase however it does not work in different devices, it only works on mine. 我已经实现了使用Firebase的Android Facebook登录,但是它不能在其他设备上使用,只能在我的设备上使用。 I've tested my app on a friend's mobile, however, facebook login did not work, it only showed progress dialog and then nothing. 我已经在朋友的手机上测试了我的应用程序,但是,facebook登录不起作用,它只显示进度对话框,然后什么也没有。 It didn't even crash. 它甚至没有崩溃。

Does anyone know why??? 有谁知道为什么??? i've sent him my apk-debug, i dont know if it makes difference. 我已经给他寄了我的apk调试程序,我不知道这是否有帮助。

This is my code 这是我的代码

import android.app.ProgressDialog;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.Toast;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FacebookAuthProvider;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.Arrays;


public class Login extends AppCompatActivity {
    private static final String REQUEST = "Login.java";
    private EditText age;
    private EditText city;
    private EditText about;
    private Button facebookButton;
    private Switch aSwitch;
    private CallbackManager mCallbackManager;
    private String TAG = "Facebook";
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        age =   findViewById(R.id.age);
        city =  findViewById(R.id.city);
        about = findViewById(R.id.about);
        aSwitch = findViewById(R.id.switch1);
        facebookButton = findViewById(R.id.fb_btn);
        mCallbackManager = CallbackManager.Factory.create();
        facebookButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                String cityName =  city.getText().toString();
                String aboutContent = about.getText().toString();
                String ageContent = age.getText().toString();

                if(ageContent.equals("")) {
                    age.setError("Preencha este campo");
                } else if(cityName.equals("")) {
                    city.setError("Preencha este campo");
                } else if(aboutContent.equals("")) {
                    about.setError("Preencha este campo");
                } else {
                    UserDetails.city = cityName;
                    UserDetails.about = aboutContent;
                    UserDetails.age = ageContent;

                    if(aSwitch.isChecked()) {
                        UserDetails.status = "Host";
                    } else {
                        UserDetails.status = "Inquilino";
                    }

                    LoginManager.getInstance().logInWithReadPermissions(Login.this, Arrays.asList("email", "public_profile"));
                    LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            Log.d(TAG, "facebook:onSuccess:" + loginResult);
                            handleFacebookAccessToken(loginResult.getAccessToken());
                        }

                        @Override
                        public void onCancel() {
                            Log.d(TAG, "facebook:onCancel");
                            // ...
                        }

                        @Override
                        public void onError(FacebookException error) {
                            Log.d(TAG, "facebook:onError", error);
                            // ...
                        }
                    });
                }
            }
        });

        mAuth = FirebaseAuth.getInstance();
    }

     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Pass the activity result back to the Facebook SDK
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    }
    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();

        if(currentUser != null) {
            UserDetails.username = currentUser.getUid();
            Log.d("Logadinho", currentUser.getUid());
            Log.d("Logando","lalalal");
            updateUI(currentUser);
        }
    }

    private void updateUI(FirebaseUser currentUser) {
        //Toast.makeText(this, "You are logged in", Toast.LENGTH_LONG).show();
        Intent intent = new Intent(Login.this, MainActivity.class);
        Log.d(REQUEST, "Starting activity");
        startActivity(intent);
        finish();
    }

    private void addUserToDatabase(FirebaseUser user) {
        DatabaseReference ref= FirebaseDatabase.getInstance().getReference().child("usuarios").child(user.getUid());
        ref.child("city").setValue(UserDetails.city);
        ref.child("about").setValue(UserDetails.about);
        ref.child("age").setValue(UserDetails.age);
        ref.child("status").setValue(UserDetails.status);
        ref.child("username").setValue(user.getUid());
        ref.child("name").setValue(user.getDisplayName());
        UserDetails.name = user.getDisplayName();
        UserDetails.username = user.getUid();
    }

    private void handleFacebookAccessToken(AccessToken token) {

        Log.d(TAG, "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(TAG, "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            addUserToDatabase(user);
                            updateUI(user);

                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithCredential:failure", task.getException());
                            Toast.makeText(Login.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            updateUI(null);
                        }

                        // ...
                    }
                });
    }

}

This is my Manifest 这是我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.sosqueen.com.sosqueen">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Login"
            android:theme="@style/AppFullScreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Chat" />
        <activity android:name=".MainActivity"/>

        <meta-data android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

        <activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name" />
        <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>

    </application>

    <uses-permission android:name="android.permission.INTERNET"/>

</manifest>

Does anyone know why this happens??? 有谁知道为什么会这样吗??? I'm quite newbie to Android development. 我是Android开发的新手。

private void PrintHashKey() { 私人void PrintHashKey(){

try {
    PackageInfo info = getPackageManager().getPackageInfo(
            "-----------PUT YOUR PACKAGE NAME ------------",
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

} }

Use this method and paste this key in facebook developer console.. and build new apk .. 使用此方法并将此密钥粘贴到Facebook开发人员控制台中。并构建新的apk ..

回答我自己的问题:看来我们必须去找Facebook开发人员,并使我们的应用生效,以使其他用户登录。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM