Android 正确使用facebook登录
在我的应用程序的起始页上,我要求用户通过Facebook进行身份验证,然后我请求一些权限并获取一些信息:Android 正确使用facebook登录,android,facebook,android-facebook,Android,Facebook,Android Facebook,在我的应用程序的起始页上,我要求用户通过Facebook进行身份验证,然后我请求一些权限并获取一些信息: LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); authButton.setFragment(this); authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
authButton.setFragment(this);
authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
fb = new FacebookMain();
我可以得到所有这些信息,但移动到我的下一页,我想在我的listview上提供一个按钮,从那里用户可以在朋友的墙上发表文章。我遵循HelloFacebook示例,它就像一个符咒一样工作,但是在我的例子中,当我尝试在一个片段中实现它时,它并没有按照预期工作,我不希望用户每次想发布时都登录(我在这里使用一个额外的权限——发布)我必须在这个片段中实现所有生命周期事件吗?是否有其他或推荐的方法
目前我正在做的是:
我的班级宣言:
public class FragmentTab1 extends Fragment {
类级别变量:
String FACEBOOK_ID;
String IMAGE_CONTENT;
EditText SEARCH;
private static final String PERMISSION = "publish_actions";
Session session;
private final String PENDING_ACTION_BUNDLE_KEY = "com.exa.digitalrem:PendingAction";
private PendingAction pendingAction = PendingAction.NONE;
private GraphUser user1;
private UiLifecycleHelper uiHelper;
与facebook相关的功能:
private PendingAction pendingAction = PendingAction.NONE;
private GraphUser user1;
private enum PendingAction {
NONE, POST_PHOTO, POST_STATUS_UPDATE
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
};
public static boolean isActive() {
Session session = Session.getActiveSession();
if (session == null) {
return false;
}
return session.isOpened();
}
private void onSessionStateChange(Session session, SessionState state,
Exception exception) {
if (pendingAction != PendingAction.NONE && (exception instanceof FacebookOperationCanceledException || exception instanceof FacebookAuthorizationException)) {
new AlertDialog.Builder(getActivity()) .setTitle("cancelled").setMessage("NotGranted").setPositiveButton("Ok", null).show();
pendingAction = PendingAction.NONE;
} else if (state == SessionState.OPENED_TOKEN_UPDATED) {
handlePendingAction();
}
updateUI();
}
private void updateUI() {
Session session = Session.getActiveSession();
boolean enableButtons = (session != null && session.isOpened());
if (enableButtons && user1 != null) {
// profilePictureView.setProfileId(user.getId());
// greeting.setText(getString(R.string.app_name, user.getFirstName()));
} else {
// profilePictureView.setProfileId(null);
// greeting.setText(null);
}
}
@SuppressWarnings("incomplete-switch")
private void handlePendingAction() {
PendingAction previouslyPendingAction = pendingAction;
// These actions may re-set pendingAction if they are still pending, but
// we assume they
// will succeed.
pendingAction = PendingAction.NONE;
}
在onCreate中:
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
if (savedInstanceState != null) {
name = savedInstanceState.getString(PENDING_ACTION_BUNDLE_KEY);
pendingAction = PendingAction.valueOf(name);
}
//===============================================
Session.openActiveSessionFromCache(getActivity());
//================================================
这是我在facebook上发布的方法,我通过点击按钮来调用它,它位于列表视图中:
public void postFB(String id) {
System.out.println("in fb");
if (isNetworkConnected()) {
Session session = Session.getActiveSession();
if (session != null) {
System.out.println("session not null");
if (hasPublishPermission()) {
//do something
WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
getActivity(), Session.openActiveSessionFromCache(getActivity()),
params)).setOnCompleteListener(
new OnCompleteListener() {
@Override
public void onComplete(Bundle values,
FacebookException error) {
// frag3.setFbId(null);
// ---------------------------- got to put
// check here
// onBackPressed();
}
}).build();
feedDialog.show();
} else if (session.isOpened()) {
// We need to get new permissions, then complete the action
// when we get called back.
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(
getActivity(), PERMISSION));
// do something
WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(
getActivity(), Session.getActiveSession(),
params)).setOnCompleteListener(
new OnCompleteListener() {
@Override
public void onComplete(Bundle values,
FacebookException error) {
// frag3.setFbId(null);
// ---------------------------- got to put
// check here
//onBackPressed();
}
}).build();
feedDialog.show();
}
}else if(session == null){
System.out.println("login");
}
} else {
Toast.makeText(getActivity(),
"Please check your internet connection", Toast.LENGTH_LONG)
.show();
}
}
然而,在我看来,这不是一个正确的方法,有没有更好的方法?另外,如何检测用户会话是否过期并提示用户再次登录?文档似乎没有显示登录按钮的内部功能 不要启动新会话。。。。在源代码中更改它
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,
Exception exception) {
onSessionStateChange(session, state, exception);
}
};
- 在项目中添加facebook SDK
- 在标记下的AndroidManifest.xml中添加以下行
- 还可以在string.xml中添加facebook应用程序id
- 宣布非公开成员
private boolean isOnCreate; private List<String> permissions = new ArrayList<String>(); private JSONObject facebookObject; private ProgressDialog progressDialog; /** The callback. */ private final com.facebook.Session.StatusCallback callback = new com.facebook.Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { SignInActivity.this.onSessionStateChange(session, state, exception); } }; private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state == SessionState.OPENED) { if (this.isOnCreate) { this.isOnCreate = false; return; } onFacebookLoginDone(); } else if (state == SessionState.CLOSED_LOGIN_FAILED) { showErrorMessage(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Session session = Session.getActiveSession(); if (session == null) { session = new Session(this); session.closeAndClearTokenInformation(); } Session.setActiveSession(session); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_fb_login: this.loginUsingFacebook(); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } /** * Login using facebook. */ private void loginUsingFacebook() { isOnCreate = false; final Session session = Session.getActiveSession(); if (session != null && session.getState().equals(SessionState.OPENED)) { Session.openActiveSession(this, true, this.callback); onFacebookLoginDone(); } else { final Session.OpenRequest temp = new Session.OpenRequest(this); this.permissions.clear(); this.permissions.add(UserClass.EMAIL); this.permissions.add("user_location"); temp.setPermissions(this.permissions); temp.setCallback(this.callback); session.openForRead(temp); } } /** * On facebook login done. */ private void onFacebookLoginDone() { final Bundle bundle = new Bundle(); bundle.putString("fields", "first_name,last_name,id,location,locale,username,email,verified"); new PerformSignUpOnServer("/me", bundle).execute(); } /** * The Class PerformSignUpOnServer. */ private class PerformSignUpOnServer extends AsyncTask<Void, Void, Void> { /** The server url. */ private String serverURL; /** The server bundle. */ private Bundle serverBundle; /** * Instantiates a new perform sign up on server. * * @param url * the url * @param bundle * the bundle */ public PerformSignUpOnServer(String url, Bundle bundle) { this.serverBundle = bundle; this.serverURL = url; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(SignInActivity.this, "", "Loading..."); super.onPreExecute(); } /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Void doInBackground(Void... params) { signUpUserOnServer(this.serverURL, this.serverBundle); return null; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Void result) { } } /** * Sign up user on server. * * @param url * the url * @param bundle * the bundle */ private void signUpUserOnServer(String url, Bundle bundle) { final Session session = Session.getActiveSession(); if (session != null && session.isClosed() == false) { final Request userInformation = new Request(session, url, bundle, HttpMethod.GET); final Response response = userInformation.executeAndWait(); facebookObject = response.getGraphObject().getInnerJSONObject(); Log.d("json", facebookObject.toString()); } } /** * On session state change. * * @param state * the state */ private void onSessionStateChange(SessionState state) { if (state == SessionState.OPENED) { if (isOnCreate) { isOnCreate = false; return; } onFacebookLoginDone(); } }
private boolean isOnCreate; 私有列表权限=新建ArrayList(); 私有JSONObject facebookObject; 私有进程对话; /**回调*/ private final com.facebook.Session.StatusCallback callback=新建 com.facebook.Session.StatusCallback(){ @凌驾 公共无效调用(会话、会话状态、异常){ signalivity.this.onSessionStateChange(会话、状态、异常); } }; private void OnSessionState更改(会话、会话状态、异常){ if(state==SessionState.OPENED){ 如果(此.isOnCreate){ this.isOnCreate=false; 返回; } onFacebookLoginDone(); }else if(state==SessionState.CLOSED\u登录失败){ 发送消息(); } } @凌驾 创建时的公共void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); Session=Session.getActiveSession(); if(会话==null){ 会话=新会话(本); session.closeAndClearTokenInformation(); } Session.setActiveSession(Session); } @凌驾 公共void onClick(视图v){ 开关(v.getId()){ 案例R.id.btn\u fb\u登录: 这个。loginUsingFacebook(); 打破 违约: 打破 } } @凌驾 受保护的void onActivityResult(int请求代码、int结果代码、意图数据){ super.onActivityResult(请求代码、结果代码、数据); Session.getActiveSession().onActivityResult(此、请求代码、结果代码、数据); } /** *使用facebook登录。 */ 私有void登录使用Facebook(){ isOnCreate=false; 最终会话=Session.getActiveSession(); if(session!=null&&session.getState().equals(SessionState.OPENED)){ openActiveSession(this,true,this.callback); onFacebookLoginDone(); }否则{ final Session.OpenRequest temp=新Session.OpenRequest(此); 此参数为.permissions.clear(); this.permissions.add(UserClass.EMAIL); 此.permissions.add(“用户位置”); 临时设置权限(此权限); 临时设置回调(此回调); openForRead(temp); } } /** *在facebook上登录完成。 */ 私有void onFacebookLoginDone(){ 最终捆绑=新捆绑(); bundle.putString(“字段”、“名字、姓氏、id、位置、区域设置、用户名、电子邮件、已验证”); 新的PerformSignUpOnServer(“/me”,bundle).execute(); } /** *类PerformSignUpOnServer。 */ 私有类PerformSignUpOnServer扩展异步任务{ /**服务器url*/ 私有字符串serverURL; /**服务器包*/ 私有包服务器包; /** *在服务器上实例化新的执行注册。 * *@param-url *网址 *@param束 *包裹 */ 公共PerformSignUpOnServer(字符串url、捆绑包){ this.serverBundle=bundle; this.serverURL=url; } /* *(非Javadoc) * *@see android.os.AsyncTask#onPreExecute() */ @凌驾 受保护的void onPreExecute(){ progressDialog=progressDialog.show(SignenActivity.this,“,”正在加载…); super.onPreExecute(); } /* *(非Javadoc) * *@see android.os.AsyncTask#doInBackground(Params[]) */ @凌驾 受保护的Void doInBackground(Void…参数){ signUpUserOnServer(this.serverURL、this.serverBundle); 返回null; } /* *(非Javadoc) * *@see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @凌驾 受保护的void onPostExecute(void结果){ } } /** *在服务器上注册用户。 * *@param-url *网址 *@param束 *包裹 */ 私有void signUpUserOnServer(字符串url、捆绑包){ 最终会话=Session.getActiveSession(); if(session!=null&&session.isClosed()==false){ 最终请求userInformation=新请求(会话、url、bundle、HttpMethod.GET); 最终响应=userInformation.executeAndWait(); facebookObject=response.getGraphObject().getInnerJSONObject(); Log.d(“json”,facebookObject.toString()); } } /** *关于会话状态的更改。 * *@param状态 *国家 */
private boolean isOnCreate; private List<String> permissions = new ArrayList<String>(); private JSONObject facebookObject; private ProgressDialog progressDialog; /** The callback. */ private final com.facebook.Session.StatusCallback callback = new com.facebook.Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { SignInActivity.this.onSessionStateChange(session, state, exception); } }; private void onSessionStateChange(Session session, SessionState state, Exception exception) { if (state == SessionState.OPENED) { if (this.isOnCreate) { this.isOnCreate = false; return; } onFacebookLoginDone(); } else if (state == SessionState.CLOSED_LOGIN_FAILED) { showErrorMessage(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Session session = Session.getActiveSession(); if (session == null) { session = new Session(this); session.closeAndClearTokenInformation(); } Session.setActiveSession(session); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_fb_login: this.loginUsingFacebook(); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); } /** * Login using facebook. */ private void loginUsingFacebook() { isOnCreate = false; final Session session = Session.getActiveSession(); if (session != null && session.getState().equals(SessionState.OPENED)) { Session.openActiveSession(this, true, this.callback); onFacebookLoginDone(); } else { final Session.OpenRequest temp = new Session.OpenRequest(this); this.permissions.clear(); this.permissions.add(UserClass.EMAIL); this.permissions.add("user_location"); temp.setPermissions(this.permissions); temp.setCallback(this.callback); session.openForRead(temp); } } /** * On facebook login done. */ private void onFacebookLoginDone() { final Bundle bundle = new Bundle(); bundle.putString("fields", "first_name,last_name,id,location,locale,username,email,verified"); new PerformSignUpOnServer("/me", bundle).execute(); } /** * The Class PerformSignUpOnServer. */ private class PerformSignUpOnServer extends AsyncTask<Void, Void, Void> { /** The server url. */ private String serverURL; /** The server bundle. */ private Bundle serverBundle; /** * Instantiates a new perform sign up on server. * * @param url * the url * @param bundle * the bundle */ public PerformSignUpOnServer(String url, Bundle bundle) { this.serverBundle = bundle; this.serverURL = url; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(SignInActivity.this, "", "Loading..."); super.onPreExecute(); } /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Void doInBackground(Void... params) { signUpUserOnServer(this.serverURL, this.serverBundle); return null; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Void result) { } } /** * Sign up user on server. * * @param url * the url * @param bundle * the bundle */ private void signUpUserOnServer(String url, Bundle bundle) { final Session session = Session.getActiveSession(); if (session != null && session.isClosed() == false) { final Request userInformation = new Request(session, url, bundle, HttpMethod.GET); final Response response = userInformation.executeAndWait(); facebookObject = response.getGraphObject().getInnerJSONObject(); Log.d("json", facebookObject.toString()); } } /** * On session state change. * * @param state * the state */ private void onSessionStateChange(SessionState state) { if (state == SessionState.OPENED) { if (isOnCreate) { isOnCreate = false; return; } onFacebookLoginDone(); } }