不调用NewPermissionsRequest回调

时间:2014-06-04 12:46:42

标签: android facebook

这是我的代码:

public class MainFragment extends Fragment implements OnClickListener {

private static final String EMAIL_PERMISSION = "email";
private static final String TAG = MainFragment.class.getSimpleName();

private UiLifecycleHelper uiHelper;
private LoginButton loginButton;
private GraphUser loggedInUser;
private TextView tvUserName, tvEmail;
private Button btnRequestEmail;
private Session mSession;

private Session.StatusCallback callback = new Session.StatusCallback() {

    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.main, container, false);
    tvUserName = (TextView) view.findViewById(R.id.tv_username);
    tvEmail = (TextView) view.findViewById(R.id.tv_email);
    btnRequestEmail = (Button) view.findViewById(R.id.btn_requestEmail);
    btnRequestEmail.setOnClickListener(this);

    loginButton = (LoginButton) view.findViewById(R.id.btn_login);
    loginButton.setReadPermissions(Arrays.asList("public_profile"));
    loginButton.setFragment(this);
    loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
                @Override
                public void onUserInfoFetched(GraphUser user) {
                    loggedInUser = user;
                    updateUI();
                }
            });
    return view;
}

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

    Session session = Session.getActiveSession();
    if (session != null && (session.isOpened() || session.isClosed())) {
        onSessionStateChange(session, session.getState(), null);
    }

    uiHelper.onResume();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    uiHelper.onActivityResult(requestCode, resultCode, data);
}

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

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

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

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (session != null && session.isOpened()) {
        mSession = session;
        btnRequestEmail.setEnabled(true);
        makeMeRequest(session);
    }
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_requestEmail:
        requestEmailPermissions();
        break;

    default:
        break;
    }
}

private void requestEmailPermissions() {
    Session.NewPermissionsRequest newPermissionsRequest = 
            new Session.NewPermissionsRequest(getActivity(), Arrays.asList(EMAIL_PERMISSION));

    newPermissionsRequest.setCallback(new StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if(session.isPermissionGranted(EMAIL_PERMISSION)){
                Toast.makeText(getActivity(), "Email permission granted :)", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(getActivity(), "Email permission denied :(", Toast.LENGTH_LONG).show();
            }
        }
    });

    Session.getActiveSession().requestNewReadPermissions(newPermissionsRequest);
}

private void makeMeRequest(final Session session) {
    Request request = Request.newMeRequest(session,
            new GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user, Response response) {
                    if (session == Session.getActiveSession()) {
                        loggedInUser = user;
                        updateUI();
                    }
                    if (response.getError() != null) {
                        Log.e(TAG, response.getError().getErrorMessage());
                    }
                }
            });
    request.executeAsync();
}

protected void updateUI() {
    if (loggedInUser != null) {
        tvUserName.setText(getString(R.string.welcome_user,
                loggedInUser.getFirstName()));

        if (loggedInUser.asMap().get(EMAIL_PERMISSION) != null) {
            String email = loggedInUser.asMap().get(EMAIL_PERMISSION).toString();
            tvEmail.setText(email);
        }
    } else {
        tvUserName.setText("");
    }
}
}

首先我使用默认的facebook登录按钮登录 会话开启后,我启用了“请求电子邮件权限”#39;按钮。
我在用户点击该按钮时请求电子邮件权限。

这有效,我看到了权限请求屏幕,但我想捕获用户是否接受权限。

所以我已添加此回调以检查是否授予了权限:

newPermissionsRequest.setCallback(new StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if(session.isPermissionGranted(EMAIL_PERMISSION)){
                Toast.makeText(getActivity(), "Email permission granted :)", Toast.LENGTH_LONG).show();
            }else{
                Toast.makeText(getActivity(), "Email permission denied :(", Toast.LENGTH_LONG).show();
            }
        }
    });

但是这个回调永远不会被调用。我该如何解决这个问题? PS:我使用的是Facebook SDK的3.14.1版本

1 个答案:

答案 0 :(得分:0)

必须调用正确活动的onActivityResult方法才能运行newPermissionRequest回调。

如果newPermissionRequest发生在片段中,请确保通过覆盖活动中的onActivityRequest然后在片段中显式调用onActivityRequest来将活动的onActivityRequest调用传递给它,如下所示:

MyActivity.java:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    getSupportFragmentManager().findFragmentById(R.id.my_fragment_frame).onActivityResult(requestCode, resultCode, data);
} 
如果您混合使用静态(xml)和动态(编程)片段,则无法调用

onActivityResult。有关详细信息,请在此处查看已接受的答案:FB sdk, requestNewPublishPermissions() doesn't call any callback

在我的情况下,我的newPermissionRequest被附加到一个不同于我想的活动,所以我看到onActivityResult被调用,但我没有意识到这是错误的活动。

相关问题