图形用户返回Null,即使会话已创建

时间:2014-06-05 06:55:45

标签: android facebook facebook-graph-api

我一直在尝试将facebook集成到我的应用程序中,但它总是返回一个Null Graph用户。我尝试添加onActivityResult方法作为解决方案告诉here,但似乎仍然没有帮助。

public class FacebookRegistartionActivity extends FragmentActivity 
{
    private Session.StatusCallback mStatusCallback = new SessionStatusCallback();
//  private static final int REQUEST_CODE_SIGN_IN = 1;
    Session session;

    @Override
    protected void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub
        super.onCreate(arg0);
        fbRegistration();
    }


    public void fbRegistration() {

        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
        session = Session.getActiveSession();
        Log.i("", "Session before : "+session);
        if (session == null) {

            session = new Session(FacebookRegistartionActivity.this);
            if (session != null) {
                Session.setActiveSession(session);
                if (session != null && !session.isOpened()&& !session.isClosed()) {
                    session.openForRead(new Session.OpenRequest(this).setCallback(mStatusCallback));
                } else {
                }
            }

        } else {
            Log.i("", "Session null ... : "+session);
            // start Facebook Login
            Session.openActiveSession(this, true, mStatusCallback);
        }
    }

代码甚至无法到达onActivityResult()方法。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("", "requestCode : "+requestCode);
        Log.i("", "resultCode : "+resultCode);
        Log.i("", "data : "+data);

        if (resultCode == RESULT_OK) {
            Session.getActiveSession().onActivityResult(this, requestCode,resultCode, data);
        }
    }


    private class SessionStatusCallback implements Session.StatusCallback {


        // callback when session changes state
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            Log.i("", "session in on status call back....."+session);
                    // Here the session is there, not null
            if (session.isOpened()) {

                Log.i("", "session is opened....."+session.isOpened());
                // make request to the /me API
                Request.newMeRequest(session, new Request.GraphUserCallback() {
                    // callback after Graph API response with user object
                    @Override
                    public void onCompleted(final GraphUser user, Response response) {
                        Log.i("in SignUp", "USER :: " + user);
//                      Log.i("in SignUp", "response :: " + response);
                        if (user != null) {
                            try{
                                String fqlQuery = "select url from profile_pic where id=me() and width=200 and height=200";
                                Bundle params1 = new Bundle();
                                params1.putString("q", fqlQuery);
                                Session session = Session.getActiveSession();
                                Request request = new Request(session, "/fql", params1,
                                        HttpMethod.GET, new Request.Callback() {
                                            public void onCompleted(Response response) {
                                                try {
                                                    String serverresponse=response.getGraphObject().getInnerJSONObject().toString();
                                                    Log.e("serverresponse", ""+serverresponse);
                                                    JSONObject jsonobj=new JSONObject(serverresponse);
                                                    JSONArray array=jsonobj.getJSONArray("data");
                                                    Log.e("","data object : "+array);
                                                    jsonobj = array.getJSONObject(0);
                                                    String fbUserImageUrl = jsonobj.getString("url");
                                                    Log.e("","image url : "+fbUserImageUrl);

                                                    Logger.show(Log.INFO, "", " AccessToken with publish stream:: " +Session.getActiveSession().getAccessToken());
                                                    String uniqueId = user.getId();
                                                    String userName = user.getName();
                                                    String image = fbUserImageUrl; //"http://graph.facebook.com/"+user.getId()+"/picture?type=large";
                                                    String emailId = user.asMap().get("email").toString();
                                                    Logger.show(Log.INFO,"","uniqueId :: "+ uniqueId);
                                                    Logger.show(Log.INFO,"","userName :: "+ userName);
                                                    Logger.show(Log.INFO,"","image :: "+ image);
                                                    Logger.show(Log.INFO,"","emailId :: "+ emailId);
                                                    }
                                                catch(Exception e)
                                                {
                                                    e.printStackTrace();
                                                }
                                            }
                                });
                                Request.executeBatchAsync(request);
                            }
                            catch (Exception e) {
                            // TODO: handle exception
                            e.printStackTrace();
                            }
                        }
                        else
                        {
                            Log.i("", "Graph user null");
                                                    // Always the Graph user is returning Null
                        }
                    }
                }).executeAsync();

            }
            else
            {
                Log.i("", "Session not opened still.....");
            }
        }
    }
}

编辑:

我检查了答案,然后意识到,我只是错过了将权限添加到Android Manifest文件中。

刚刚意识到!我做了一切,除了在Android Manifest文件中添加以下权限。

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

但是,仍然想知道我是如何得到这个会话的。意味着,它不需要网络连接?考虑到我测试的设备已经安装了facebook应用程序。

会话是由facebook应用程序提供的吗?想知道facebook应用程序在我们的应用程序中的登录流程如何工作,使用facebook sdk。

对此有任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的 - 是的,当创建一个facebook Session对象时,它会尝试从TokenCachingStrategy初始化自己。但是必须有一个Session令牌缓存。正如您所说的那样,您从其他应用程序使用相同的应用程序ID,该应用程序已由用户授权,会话已创建并保存在缓存中。

因为facebook会根据应用ID管理会话,并且会话已经创建,所以它会从新应用的缓存中获取。但是,当您调用Request.newMeRequest时,为了获取图形用户,它正在建立互联网连接,因为清单中没有互联网权限,您的应用程序无法连接到Facebook服务器以获取相同的内容。