Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 未调用NewPermissionsRequest回调_Android_Facebook - Fatal编程技术网

Android 未调用NewPermissionsRequest回调

Android 未调用NewPermissionsRequest回调,android,facebook,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; privat

这是我的代码:

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登录按钮登录。
当会话打开时,我启用“请求电子邮件权限”按钮。
当用户单击该按钮时,我请求电子邮件权限

这是可行的,我看到了权限请求屏幕,但我想捕获用户是否不接受权限

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

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版

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

如果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。有关更多信息,请参见以下公认答案:


在我的例子中,我的新许可请求附加到了一个与我想象中不同的活动,因此我看到有人调用了
onActivityResult
,但我没有意识到这是一个错误的活动。

我也有同样的问题。你找到这个雪人的解决方案了吗?我不记得了,但我开始使用,它基本上是一个围绕facebook SDK的包装器,简化了一切。