2

ユーザーのメールアドレスと誕生日を取得しようとしています (Me リクエストを使用)。私のアプリにはメールと user_birthday のアクセス許可があり、使用している fb アカウントにはメールと誕生日が設定されています。

「Graph API Explorer」( https://developers.facebook.com/tools/explorer ) を「fields=id,email,birthday」でユーザー access_token を使用して使用しようとすると、取得できるのは ID だけです。

誰でもこれについてアドバイスしてもらえますか。

これが私のコードです:

        Session.openActiveSession(this, true, new Session.StatusCallback() {
        // callback when session changes state
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {
                // make request to the /me API
                Request request = Request.newMeRequest(session, new Request.GraphUserCallback() {
                    // callback after Graph API response with user object
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                        if (user != null) {
                            // here I check the infos I got.
                            Log.d("some tag", user.getInnerJSONObject().toString()); // it shows only the id, no email or birthday.

                            if (Session.getActiveSession() != null) {
                                Log.i(TAG, "Log out from FB");
                                Session.getActiveSession().closeAndClearTokenInformation();
                            }
                        }
                    }
                });
                // set params.
                request.getParameters().putString("fields", "id,email,birthday");
                // execute request.
                request.executeAsync();
                Log.d(TAG, request.toString());
            }

            if (exception != null) {
                exception.printStackTrace();
            }
        }
    });

どうもありがとう。

4

5 に答える 5

2

最後に、getMeRequest の代わりに OpenRequest を使用してアプローチを変更しました。

これが私のコードです:

    public void onClick(View v) {
    Logger.d(TAG, "Start FB session");
    // check if a session exists.
    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) {
        // create a new session.
        Session session = new Session.Builder(getApplicationContext()).build();
        // set it a the active session.
        Session.setActiveSession(session);
        // keep a variable link to session.
        currentSession = session;
    }
    // if a session is already open then issue a request using the available
    // session. Otherwise ask for user credentials.
    if (currentSession.isOpened()) {
        // The user is logged in.
        Logger.e(TAG, "User is logged in.");
        Session.getActiveSession().closeAndClearTokenInformation();
        Logger.i(TAG, "Session closed an token information cleared.");

        // get user data here with no extra call.
        Session.openActiveSession(this, true, new Session.StatusCallback() {
            @Override
            public void call(final Session session, SessionState state, Exception exception) {
                if (session.isOpened()) {
                    Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                        @Override
                        public void onCompleted(GraphUser user, Response response) {
                            if (user != null) {
                                Logger.i(TAG, "User:" + user.getInnerJSONObject());
                            }
                        }
                    });
                }
            }
        });
    } else {
        // Ask for username and password
        OpenRequest op = new Session.OpenRequest((Activity) this);
        // don't use SSO.
        op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO);
        // no callback needed.
        op.setCallback(null);
        // set permissions.
        List<String> permissions = new ArrayList<String>();
        permissions.add("email");
        permissions.add("user_birthday");
        op.setPermissions(permissions);
        // open session for read.
        currentSession.openForRead(op);
        Logger.d(TAG, "Session open for read request issued.");
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Logger.d(TAG, "Request code is: " + requestCode);
    Logger.d(TAG, "Result code is: " + resultCode);
    super.onActivityResult(requestCode, resultCode, data);
    if (Session.getActiveSession() != null)
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);

    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) {
        Session session = new Session.Builder(getApplicationContext()).build();
        Session.setActiveSession(session);
        currentSession = session;
    }

    if (currentSession.isOpened()) {
        Session.openActiveSession(this, true, new Session.StatusCallback() {
            @Override
            public void call(final Session session, SessionState state, Exception exception) {
                if (session.isOpened()) {
                    Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
                        @Override
                        public void onCompleted(GraphUser user, Response response) {
                            if (user != null) {
                                Logger.i(TAG, "User:" + user.getInnerJSONObject());
                            }
                        }
                    });
                }
            }
        });
    }
}

これが役立つことを願っています。

于 2013-09-25T15:50:50.710 に答える
0

このコードは役に立ちました。これにより、ユーザーの電子メールが 3 つの異なる方法で取得され、ログに記録されます

     try{       
    //  new Read().execute("Facebook"); 
        Session.openActiveSession(this, true, new Session.StatusCallback() {

              // callback when session changes state
              @Override
              public void call(Session session, SessionState state, Exception exception) {
                if (session.isOpened()) {

                  // make request to the /me API
                  Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    // callback after Graph API response with user object
                    @Override
                    public void onCompleted(GraphUser user, Response response) {
                      if (user != null) {
                      //  TextView welcome = (TextView) findViewById(R.id.welcome);
                       // welcome.setText("Hello " + user.getName() + "!");

                        Log.d("useremai", (String) user.getProperty("email"));

                    Log.d("USER",  user.getInnerJSONObject().toString()); 
                    JSONObject details = user.getInnerJSONObject();
                    useremail = details.optString("email");
                    Log.d("name", user.getName());
                    Log.d("email", useremail);

                      }
                    }
                  });
                }
              }
            });
        }catch(NoClassDefFoundError e){
            e.printStackTrace();
        }
于 2013-11-14T10:51:39.367 に答える
0

Request.executeMeRequestAsync(...){...} の前にもこれを試すことができます

        List<String> permissions = session.getPermissions();

        List<String> permissionsBirthday = new ArrayList<String>();
        permissionsBirthday.add("user_birthday");

        if (!isSubsetOf(permissionsBirthday, permissions)) {
            pendingPublishReauthorization = true;
            Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, permissionsBirthday);

            if (setPermissions(session, newPermissionsRequest))
                return;
        }

メソッド isSubsetOf();

private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
    for (String string : subset) {
        if (!superset.contains(string)) {
            return false;
        }
    }
    return true;
}

お役に立てれば。

于 2013-10-01T19:08:45.990 に答える
0

これを試してください:

ユーザーのオブジェクトがある場合は、以下を実行します。

if (user != null) {
 String UserId = user.getId();
try {
Log.i("Birthdate", ""+user.getInnerJSONObject().getString("birthday"));
} catch (JSONException e) {
e.printStackTrace();
}
}
于 2014-05-01T06:36:23.103 に答える
0

Request.GraphUserCallback()を使用している場合は、メイン UI スレッドで使用するのが最善です

Session s = Session.getActiveSession();

    if(s!=null)
    {
     Request.executeMeRequestAsync(s,new Request.GraphUserCallback() 
     {

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


            if(user!=null)
            {
                 try {

                    String fbid=null;
                    String birthday=null;
                    fbid=user.getId();
                    birthday=user.getBirthday();


                } catch (JSONException e1) {

                    e1.printStackTrace();
                }



            }

        }
     });
    }
于 2013-08-02T05:35:33.543 に答える