ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

带有片段的Android FB API 3.0会话设置

2019-06-25 16:11:40  阅读:179  来源: 互联网

标签:android facebook facebook-android-sdk


我正在使用FB API 3.0 for Android,我正在尝试以正确的方式设置会话.

但是,似乎我做错了什么,或者说我错过了什么.

在我的启动器活动中,我检查是否已有会话,如果它不存在,我创建一个新会话(如FB示例中所示):

Settings.addLoggingBehavior(LoggingBehaviors.INCLUDE_ACCESS_TOKENS);

    Session session = Session.getActiveSession();
    if (session != null){
    String sesija = session.toString();
    Log.w ("ss", sesija);}

    if (session == null) {
        if (savedInstanceState != null) {
            session = Session.restoreSession(this, null, MyGlobals.INSTANCE.statusCallback, savedInstanceState);
            Log.w("No Session found", "Loading saved session as it exists");
        }
        if (session == null) {
            session = new Session(this);
            Log.w("No Session found", "CreatingNewSession");

            String sesija2 = session.toString();
            Log.w ("ss2", sesija2);
        }
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
            session.openForRead(new Session.OpenRequest(this).setCallback(MyGlobals.INSTANCE.statusCallback));
            Log.w("There is an active session", "Active Session Exists");
        }

    }

此时我的日志说明了这一点:

10-24 09:11:52.284: W/ss(1404): {Session state:CREATED, token:{AccessToken token: permissions:[}, appId:xxxxxx}

(AppId是正确的)

然后在我的片段中,我尝试使用以下代码登录到Facebook:

 Session session = Session.getActiveSession();
 if (!session.isOpened() && !session.isClosed()) {
            Log.w("Session is not opend", "Session is not closed");
            session.openForRead(new Session.OpenRequest(getActivity()).setCallback(MyGlobals.INSTANCE.statusCallback));
        } else {
            Session.openActiveSession(getActivity(), true, MyGlobals.INSTANCE.statusCallback);
            Log.w("Open Active Session", "Status Callback");
        }

此时,FB webview出现,我设置了用户名并通过,它有点工作,然后消失.

现在,我有点无处可去,我没有看到回应和TOKEN收到,如果我再次点击登录(在同一个按钮上),我的应用程序崩溃了.

在日志中我有这个:

10-24 09:12:31.944: W/ss(1404): {Session state:OPENING, token:{AccessToken token: permissions:[}, appId:xxxxxx}

如果我将它与FB提供的SessionLoginExample进行比较,我会到达:

10-24 09:08:50.004: W/ss(1356): {Session state:OPENED, token:{AccessToken token:AAAFaKtb7Pg4BALYg4B5eosa0ZAE9ZAXB0ZBMFDJdNbsDsZAkGJUfKtGs71OEJikDxT2VBfo4QMXiNASz23ZAa6D76eUxW0mZAMa013HP2kxgZDZD permissions:[}, appId:xxxxxxx}

意思是我做错了,因为我没有捕获返回的AccessToken,并且没有正确保存.

这就是我认为是错误的,但我不明白我应该如何以正确的方式阅读会话信息,或者说在片段中捕获和保存令牌信息的位置.

我试着把片段放进去:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Boolean session = Session.getActiveSession().onActivityResult(getSherlockActivity(), requestCode, resultCode, data);

}

因为这是示例中的“onActivityResult”,但似乎它什么也没做.

总结一下:
我在启动器活动后面创建会话.然后,如果没有安装FB应用程序,则在Tab4(设置)上,用户应该能够使用webview登录到FB.然后在Tab1和Tab2上,用户应该可以像在Instagram上一样将图像分享到FB.
如果安装了应用程序,我将禁用选项卡4,并让用户使用Tab1和Tab2共享FB应用程序.

TNX.

解决:
从未写过但应该众所周知的事情.执行FB身份验证时,必须执行“On Activity Result”代码以使用会话保存令牌.
但是,如果您正在处理Fragments和Tabs,就像我一样,函数“onActivityResult”永远不会在Fragment代码中执行,但必须在处理片段/标签的Activity中执行.

解决方法:

所以看起来你已经解决了这个问题并且你的解决方法很好,但是我想在这里给出另一个选项,以防你或其他人使用Fragment代替它.

对于您不能或不想从FacebookActivity派生的情况,您可以使用Activity或Fragment来初始化Session. Activity和Fragment都有onActivityResult你可以覆盖,而且使用的是取决于你传递什么来初始化Session.OpenRequest.

因此,如果您希望回调来到Fragment,您可以调用:

...new Session.OpenRequest(myFragment)...

然后覆盖片段中的onActivityResult并将调用转发给Session.

这有点好,因为你的Fragment不再需要具备它正在运行的Activity的特殊知识.

标签:android,facebook,facebook-android-sdk
来源: https://codeday.me/bug/20190625/1287797.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有