Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t注销后使用Facebook凭据重新登录_Java_Android_Facebook_Facebook Login_Facebook Android Sdk - Fatal编程技术网

Java Can';t注销后使用Facebook凭据重新登录

Java Can';t注销后使用Facebook凭据重新登录,java,android,facebook,facebook-login,facebook-android-sdk,Java,Android,Facebook,Facebook Login,Facebook Android Sdk,我有一个Android应用程序,允许用户使用Facebook凭据登录。一旦他们第一次注销,他们就不能再次登录。在从Facebook的网站上清除应用程序的权限后,登录即可正常工作 我使用login按钮登录 需要能够访问登录信息的活动,请扩展此AuthActivityActivity public class AuthActivity extends Activity { private AuthUtils authUtils; @Override protected vo

我有一个Android应用程序,允许用户使用Facebook凭据登录。一旦他们第一次注销,他们就不能再次登录。在从Facebook的网站上清除应用程序的权限后,登录即可正常工作

我使用
login按钮登录

需要能够访问登录信息的活动,请扩展此
AuthActivity
Activity

public class AuthActivity extends Activity {
    private AuthUtils authUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        authUtils = new AuthUtils(this);
        authUtils.onCreate(savedInstanceState);
    }

    public AuthUtils getAuthUtils() {
        return authUtils;
    }

    @Override
    public void onStart() {
        super.onStart();
        authUtils.onStart();
    }

    @Override
    public void onStop() {
        super.onStop();
        authUtils.onStop();
    }

    @Override
    public void onResume() {
        super.onResume();
        authUtils.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        authUtils.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        authUtils.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        authUtils.onSaveInstanceState(outState);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        authUtils.onActivityResult(requestCode, resultCode, data);
    }
}
AuthUtils看起来像这样。我去掉了所有与Google+登录相关的东西,以及所有与登录过程无关的东西,比如用我的应用程序首选项保存用户信息

public class AuthUtils implements ConnectionCallbacks, OnConnectionFailedListener {
    private final Activity activityContext;
    private UiLifecycleHelper facebookUiHelper;

    public AuthUtils(Activity context) {
        this.activityContext = context;

        facebookUiHelper = new UiLifecycleHelper(context, facebookStatusCallback);
    }

    public void signInFacebook() {
        LoginButton facebookLoginButton = new LoginButton(activityContext);
        facebookLoginButton.setReadPermissions(Arrays.asList("email"));
        facebookLoginButton.performClick();
    }

    public void signOutFacebook() {
        Session facebookSession = Session.getActiveSession();
        if(facebookSession != null) {
            facebookSession.closeAndClearTokenInformation();
        }
    }

    private StatusCallback facebookStatusCallback = new StatusCallback() {
        @Override
        public void call(final Session session, SessionState state, Exception exception) {
            if(state.isOpened()) {
                Request.newMeRequest(session, new GraphUserCallback() {
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        String email = "";

                        if(user.asMap().containsKey("email")) {
                            email = user.getProperty("email").toString();
                        } else {
                            // ... not related to login
                        }

                        // Some actions here, not related to login.
                    }
                });
            } else if(state.isClosed()) {
                // ... not related to login
            }
        }
    };

    public void onCreate(Bundle savedInstanceState) {
        facebookUiHelper.onCreate(savedInstanceState);
    }

    public void onResume() {
        facebookUiHelper.onResume();
    }

    public void onPause() {
        facebookUiHelper.onPause();
    }

    public void onDestroy() {
        facebookUiHelper.onDestroy();
    }

    public void onSaveInstanceState(Bundle outState) {
        facebookUiHelper.onSaveInstanceState(outState);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        facebookUiHelper.onActivityResult(requestCode, resultCode, data);
    }
}

即使在运行Facebook的示例应用程序时,我也遇到了同样的问题。我通过向Facebook提供默认签名密钥解决了这一问题:在的示例应用程序的开发者设置中,然后在Android平台的应用程序设置中

Facebook提供了一种获取默认密钥的简单方法,可在“疑难解答”下找到。下面提供了运行Hello Facebook示例应用程序时执行此操作的代码

try {
    PackageInfo info = getPackageManager().getPackageInfo(
        "com.facebook.samples.hellofacebook", 
        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 (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}

注意:发布应用程序时,不应使用默认密钥,而应使用自己的密钥生成和签署应用程序。

能否请您详细解释“无法再次登录”。什么不起作用?没有对话,或者他们不能接受?您是否收到API响应/错误?请提供更多信息@Flaxfield当点击按钮时,Facebook应用程序将打开,并保持活动状态几秒钟,但没有显示任何内容。然后它关闭并调用状态回调侦听器
state.isClosed()
保持为真。谢谢!您还可以显示使用LoginButton的代码吗。您请求什么权限?@Flaxfield在代码中我所做的是:
facebookLogin.setReadPermissions(Arrays.asList(“email”)。在布局中,我只需指定按钮并添加一些尺寸和位置。在没有该电子邮件权限的情况下也会发生此问题。首次成功登录后,您是否将这些凭据保存在任何位置?