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

Android 将Facebook登录和权限请求合并为一个,android,facebook,facebook-graph-api,permissions,Android,Facebook,Facebook Graph Api,Permissions,我试图创建一个对话框,要求用户登录Facebook。事实上,我并不太在乎登录本身:我真正想要的是代表用户发布照片的权限;没有别的了。下面是我的整个对话。有人能帮我更正一下密码吗?现在它与Facebook图书馆中的一些NPE发生了冲突。我将我的代码与HelloFacebookSampleActivity示例进行比较。我可以看出这两个明显不同。但我似乎不能正确地修好我的。同样,我希望能立即要求用户登录并获得许可,而不是分两步进行 public class FacebookOptInFragment

我试图创建一个对话框,要求用户登录Facebook。事实上,我并不太在乎登录本身:我真正想要的是代表用户发布照片的权限;没有别的了。下面是我的整个对话。有人能帮我更正一下密码吗?现在它与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,我发现登录过程与权限请求过程是分开的。有没有办法把两者结合起来?也就是说,当我要求用户登录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));

请有人显示一个完整的代码片段,显示如何在登录时请求权限。我对此很陌生,所以填空很困难,所以完整的代码片段会很有帮助,这就是我提交整个类进行编辑的原因。

发布\u操作被视为发布权限,通常需要与其他阅读权限(如电子邮件、类似文件、,等等。如果您想要的唯一权限是发布操作,那么您可以尝试以下操作:

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

您获得的NPE可能是因为您没有将应用程序ID放入AndroidManifest.xml中,而不是查看权限。

我在manifest as中有应用程序ID,在xml资源中有字符串。那么为什么它看不到应用程序id呢?您使用的是哪个版本的SDK?我假设你的应用程序在切换到FB应用程序进行登录之前崩溃?另外,HelloFacebook示例对您有用吗?