Facebook 登录按钮回调函数未被调用

9

我正在尝试在我的安卓应用上实现简单的Facebook登录。当我点击登录按钮时,应用会被重定向到Facebook页面,输入凭据后,再次返回到我的应用。但是LoginButton回调函数没有被调用。虽然有一些类似的问题,但它们有一个单独的片段类。然而,我正在从主Activity中完成所有操作。以下是我的代码:

package com.example.ankur.facebookdemo;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

public class MainActivity extends AppCompatActivity {
    private LoginButton loginButton;
    CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        setContentView(R.layout.activity_main);

        loginButton = (LoginButton) findViewById(R.id.login_button);
        if (loginButton == null) {
            Log.v("CheckLogin", "null");
        }
        else {
            Log.v("CheckLogin", "not null");
        }


        loginButton.setReadPermissions("user_friends");

        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
                Toast.makeText(getApplicationContext(),"Fb Login Success", Toast.LENGTH_LONG);
                Log.v("CheckLogin", "successfully connected to facebook");
            }

            @Override
            public void onCancel() {
                // App code
                Toast.makeText(getApplicationContext(),"Fb on cancel",Toast.LENGTH_LONG);
                Log.v("CheckLogin", " connection to facebook cancelled");

            }

            @Override
            public void onError(FacebookException exception) {
                // App code
                Toast.makeText(getApplicationContext(),"Fb Login Error",Toast.LENGTH_LONG);
                Log.v("CheckLogin", "Error on  connection to facebook");
            }
        });

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

使用哪个版本的FB SDK作为构建依赖?例如:facebookSDK = 'com.facebook.android:facebook-android-sdk:4.6.0' - Robert Rowntree
2个回答

16

您忘记重写 onActivityResult() 方法。 onActivityResult() 导致回调方法被调用。

请参照以下示例:

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

希望这可以帮到你!祝一切顺利 :)


非常感谢!它已经解决了问题。 - Ankur Bhatia
你好Narayan,我现在又遇到了回调的问题。代码在成功时调用onSuccess回调函数,但是当我点击注销按钮时,onCancel没有被调用。我已经在这里提出了另一个问题:http://stackoverflow.com/questions/34978263/facebook-sdk-android-onsuccess-called-but-oncancel-not-called - Ankur Bhatia

3
你缺少 onActivityResult 钩子:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}

文档 明确指出:

每个与FacebookSDK登录或分享集成的活动和片段都应该将onActivityResult转发到callbackManager。


非常感谢!它修复了问题。 - Ankur Bhatia
数据作为意图附加项返回,其中包含一个可序列化对象,该对象中包含什么? - JPM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接