这是我的代码:
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版本
答案 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
被调用,但我没有意识到这是错误的活动。