将Facebook登录和权限请求合并为一个

时间:2015-02-27 20:27:55

标签: android facebook facebook-graph-api permissions

我正在尝试创建一个对话框,要求用户使用Facebook登录。实际上我并不关心登录本身:我真正想要的是允许代表用户发布照片;没有其他的。下面是我的Dialog。有人请为我更正代码吗?现在它在Facebook库中崩溃了一些NPE。我将我的代码与示例HelloFacebookSampleActivity进行比较。我可以看出这两者显然是不同的。但我似乎无法正确修复我的。同样,我希望立即要求用户登录并获得许可,而不是分两步执行。

public class FacebookOptInFragment extends DialogFragment {
    private final String TAG = FacebookOptInFragment.class.getSimpleName();
    private LoginButton loginButton;
    private GraphUser user;
    private static final String PERMISSION = "publish_actions";

    private UiLifecycleHelper uiHelper;

    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if ((exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) {
            new AlertDialog.Builder(FacebookOptInFragment.this.getActivity())
                .setTitle("Cancel")
                .setMessage("Permission not granted")
                .setPositiveButton("Ok", null)
                .show();
        }
        updateUI();
    }

    private void updateUI() {
        Session session = Session.getActiveSession();
        if (session != null && session.isOpened()) {
            //user has agreed to post photos… so make a note of that
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        View view = inflater.inflate(R.layout.facebook_optin, container);
        loginButton = (LoginButton) view.findViewById(R.id.login_button);
        loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                FacebookOptInFragment.this.user = user;
                updateUI();
            }
        });

        return view;
    }

}

错误

 java.lang.RuntimeException: An error occured while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at java.lang.Thread.run(Thread.java:841)


 Caused by: java.lang.NullPointerException
    at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:911)
    at com.facebook.internal.Utility.queryAppSettings(Utility.java:664)
    at com.facebook.widget.LoginButton$1.doInBackground(LoginButton.java:678)
    at com.facebook.widget.LoginButton$1.doInBackground(LoginButton.java:1)
    at android.os.AsyncTask$2.call(AsyncTask.java:288)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    ... 4 more



查看HelloFacebookSampleActivity,我发现Login进程与权限请求进程是分开的。有没有办法将两者结合起来?也就是说,当我要求用户使用Facebook登录时,我“自动”获得我需要的权限。我的意思是我不想在两个不同的时间使用两个不同的窗口。这对我的情况很重要,因为我真正想要的是允许为用户分享照片;登录本身是无关紧要的。那么我如何将两者结合起来呢?

提到的HelloFacebookSampleActivity的示例代码是

登录

loginButton = (LoginButton) findViewById(R.id.login_button);
        loginButton.setUserInfoChangedCallback(new LoginButton.UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                HelloFacebookSampleActivity.this.user = user;
                updateUI();
                // It's possible that we were waiting for this.user to be populated in order to post a
                // status update.
                handlePendingAction();
            }
        });

对于许可请求

session.requestNewPublishPermissions(new  Session.NewPermissionsRequest(this, PERMISSION));

有人请出示一个完整的代码段,显示如何在登录时请求权限。我是新手,所以填写空白是很困难的,所以完整的代码片段会有所帮助,这就是为什么我提交我的全部内容用于编辑的课程。

1 个答案:

答案 0 :(得分:0)

publish_actions被认为是"发布"许可,通常需要一个单独的请求,而不是其他"读"权限(例如电子邮件,喜欢等)。如果您想要的唯一权限是publish_actions,那么您可以尝试类似:

loginButton = (LoginButton) view.findViewById(R.id.login_button);
loginButton.setPublishPermissions('publish_actions');
...

您获得的NPE很可能是因为您没有将应用ID放在AndroidManifest.xml中(请参阅getting started guide)而不是权限。