我正在尝试创建一个对话框,要求用户使用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));
有人请出示一个完整的代码段,显示如何在登录时请求权限。我是新手,所以填写空白是很困难的,所以完整的代码片段会有所帮助,这就是为什么我提交我的全部内容用于编辑的课程。
答案 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)而不是权限。