Android中的Facebook集成与Native应用程序兼容,但不能与FB Web View一起使用(NATIVE APP未安装)

时间:2014-01-23 07:31:24

标签: android facebook

我正在尝试在我的应用程序中集成Facebook SDK for android。

以下是我用来使用FB集成的代码。

@Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        bundle = savedInstanceState;
        permissions = new ArrayList<String>();
        readpermissions = new ArrayList<String>();

        permissions.add("publish_actions");
        readpermissions.add("email");
        executeFacebookLogin();
    }

    private void executeFacebookLogin() {
        Session session = Session.getActiveSession();
        Log.i("FB Login "," Session Status "+session);
        if(session == null) {
            if(session == null) {
                Log.i("TEST","CREATE NEW SESSION");
                session = new Session(this);
            }
            Session.setActiveSession(session);          
            session.addCallback(statusCallback);
            if(session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
                session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
            } 
        }   
        Log.i("TEST","Session State "+session.isOpened()+ " for close "+session.isClosed());
        if(session.isClosed()) {
            session.closeAndClearTokenInformation();
            Session.setActiveSession(null);
        }
        if(!session.isOpened()) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
            Log.i("FB Login ","Open for Publish");
        } else {
            Session.openActiveSession(this, true, statusCallback);
        }

    }


    private class SessionStatusCallback implements Session.StatusCallback {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            //Check if Session is Opened or not
            processSessionStatus(session, state, exception);
        }
    }

    @SuppressWarnings("deprecation")
    public void processSessionStatus(Session session, SessionState state, Exception exception) {
        Log.i("TEST","Session in process session "+session);
        if(session != null && session.isOpened()) {

            if(session.getPermissions().contains("publish_actions")) {
                //Show Progress Dialog 
                dialog = new ProgressDialog(this);
                dialog.setMessage("Loggin in..");
                dialog.show();
                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {


                        if (dialog!=null && dialog.isShowing()) {
                            dialog.dismiss();
                        }
                        if(user != null) {
                            Map<String, Object> responseMap = new HashMap<String, Object>();
                            GraphObject graphObject = response.getGraphObject();
                            responseMap = graphObject.asMap();
                            Log.i("FbLogin", "Response Map KeySet - " + responseMap.keySet());
                            // TODO : Get Email responseMap.get("email"); 

                            fb_id = user.getId();
                            fb_email = null;
                            user.getBirthday();
                            fb_userName = user.getUsername();
                            fb_fullname = user.getFirstName() +" "+user.getLastName();

                            String name = (String) responseMap.get("name");
                            if (responseMap.get("email")!=null) {
                                fb_email = responseMap.get("email").toString();
                                Log.i("TEST", "FB_ID="+fb_id +"email="+fb_email+"name="+name+"user_name="+user.getUsername()+"birthday="+user.getBirthday());
                                Session session = Session.getActiveSession();
                                tokenKey = session.getAccessToken();
                                SharedPreferenceStoring myPrefsClass = new SharedPreferenceStoring();
                                myPrefsClass.storingFBToken(FBActivity.this, tokenKey);
                                Log.i("TEST", "TOKEN kEY fourth = "+tokenKey);

                            }
                            else {
                                //Clear all session info & ask user to login again
                                Session session = Session.getActiveSession();                               
                                if(session != null) {
                                    session.closeAndClearTokenInformation();
                                }
                            }
                        }
                    }
                });
            } else {
                session.requestNewPublishPermissions(new Session.NewPermissionsRequest(FBActivity.this, permissions));

            }
        }
    }

如果安装了NATIVE FB应用程序,此代码可以正常运行。

如果未安装Native FB应用程序,则会显示FB登录Web视图(这是正确的) 但是,如果我登录Web视图,它再次向我显示我已经授权应用程序,当我点击Ok按钮时,我得到相同的登录FB视图,而不是将控制权返回给我的应用程序。

我不明白为什么会这样。

有谁能告诉我如何解决这个问题?

**编辑**

当我按下“你已经授权此应用程序”屏幕上的确定按钮时,我在我的logcat中得到了这个

{Session state:OPENED, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[email]}, appId:xxxxxxxxxxxxx}  

{act=SSO_WITH_FALLBACK cmp=com.myapp/com.facebook.LoginActivity (has extras)}

1 个答案:

答案 0 :(得分:0)

对此行进行评论

 if(!session.isOpened()) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
        Log.i("FB Login ","Open for Publish");
    } else {
        Session.openActiveSession(this, true, statusCallback);
    }

EDIT:此代码适用于我本地和Webview都试过这个..

并查看此FACEBOOK LOGIN

  if (fb_session != null && fb_session.isOpened()) {
  makeMeRequest(fb_session);     
  Log.i("Facebook Login State == >", "Facebook Login State");     
 } else {
  if (fb_session == null) {
   fb_session = new Session(mCurrContext);            
       }
  Session.setActiveSession(fb_session);
  ConnectToFacebook();
   Log.i("Facebook not Login State == >", "Facebook Not login State");
 }         
}