我对 Android 非常陌生,实际上是整个 Java ——我来自 PHP 背景,这对我在 Android 上工作提出了挑战。
我在 Android 中的第一个任务是在现有应用程序中使用 Facebook SDK 实现 Facebook 会话管理。我首先导入了必要的 SDK 文件,并在我的应用程序(主活动)的登陆屏幕中编写了如下代码:
onCreate() -
- 创建 FB 对象,将其存储在 Utility 中
- 实例化异步 api 调用的 asynrunner 对象并将 FB 对象实例提供给 AsyncronusRunner
- 如果存在会话,则通过调用 SessionStore.restore() 恢复会话,*
像这样调用 init() -
init(LandingPage.this, AUTHORIZE_ACTIVITY_RESULT_CODE, Utility.mFacebook, permissions); public void init(final Activity activity, final int activityCode, final Facebook fb, final String[] permissions) { mActivity = activity; mActivityCode = activityCode; mFb = fb; mPermissions = permissions; mHandler = new Handler(); SessionEvents.addAuthListener(mSessionListener); SessionEvents.addLogoutListener(mSessionListener); }// init()
onStart() -
我已经创建了一个自定义 FB 登录按钮,并且我将其类型转换为“按钮”(而不是“登录按钮”)
在此“按钮”对象的 onClick() 上,正在检查 FB 会话是否有效。如果是?从FB获取数据,继续。如果不?强制用户查看 FB 的登录对话框。
@Override protected void onStart() { super.onStart(); mLoginButton = (Button) findViewById(R.id.fb_login); mLoginButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { if (Utility.mFacebook.isSessionValid()) { requestUserData(); }else{ Utility.mFacebook.authorize.authorize(mActivity, mPermissions, mActivityCode, new LoginDialogListener()); } } }); }//onStart() private class LoginDialogListener implements DialogListener { public void onComplete(Bundle values) { SessionEvents.onLoginSuccess(); requestUserData(); //userData fetches FB profile data }// onComplete() }// class
请求用户数据() -
在这里,我只是创建了一个 Bundle 来传递我需要的字段:
public void requestUserData() { Bundle params = new Bundle(); params.putString("fields", "first_name, name, id, picture, gender, email"); Utility.mAsyncRunner.request("me", params, new UserRequestListener()); // callback for fetching fields }// requestUserData() public class UserRequestListener extends BaseRequestListener { @SuppressWarnings("deprecation") @Override public void onComplete(final String response, final Object state) { JSONObject jsonObject; try { jsonObject = new JSONObject(response); final String picURL = jsonObject.getJSONObject("picture").getJSONObject("data").getString("url"); final String first_name = jsonObject.getString("first_name"); final String full_name = jsonObject.getString("name"); final String gender = jsonObject.getString("gender"); final String fb_id = jsonObject.getString("id"); String email = "" ; // initialized blank first otherwise gives Json exception if email returned null from FB // store values in Singleton Singleton.fb_firstname = first_name ; //although it says "first name", am storing full name in there Singleton.fb_user_id = fb_id; Singleton.fb_gender = gender; try { email = jsonObject.getString("email");//sometimes we dont get an email from Facebook Singleton.fb_email_id = email; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Bundle parameters = new Bundle(); String mAccessToken = access_token; parameters.putString("format", "json"); parameters.putString(TOKEN, mAccessToken); String url = "https://graph.facebook.com/me/friends"; String friends_response = null; try { friends_response = Util.openUrl(url, "GET", parameters); } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } JSONObject obj = Util.parseJson(friends_response); .......... // CALLING A WEBSERVICE THAT RETURNS A USER-ID BASED ON THE FACEBOOK ID // If the service returns status=0, we need to redirect user to Screen A, else to ScreenB .......... if(status.equals("0")){ Intent intent = new Intent(LandingPage.this,ScreenA.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish(); }else { Intent intent = new Intent(LandingPage.this, ScreenB.class); startActivity(intent); finish(); }//else } catch (Exception e) { e.printStackTrace(); } ]// onComplete() }// class()
现在我的问题在于 requestUserData()
一旦我拥有了我需要处理的所有 Facebook 个人资料数据,我就会执行一个 if/else 条件,该条件应该处理 FB 调用响应中返回的变量,并基于该条件立即将用户重定向到 ScreenA 或 ScreenB,即在此序列:
1.用户启动应用程序,来到 MainActivity 开始的“LandingPage”
2.用户单击“LandingPage”上的“FB Connect”按钮
3.按钮的OnClick() 事件触发调用 LoginDialogListener() 的实例
4. LoginDialogListener 获取用户到 FB 登录屏幕询问用户名/密码 - 用户输入凭据并通过权限屏幕成功授权应用程序
5.一旦他在最终权限屏幕上单击“确定”,用户将返回到“登陆页面”几秒钟,然后重定向到上面给出的 if/else 块中给出的“ScreenA”或“ScreenB”。
基本上我需要的是让用户不要被扔回“LandingPage”并按照我的逻辑直接发送到相应的屏幕。但无论我尝试什么,这似乎都没有发生。用户在授权应用程序后总是会在几分之一秒内返回到 LandingPage,然后被发送到下一个屏幕。我怎样才能避免这种情况?
注意:在我的 Native Android Facebook 设置中,我将类名命名为:LandingPage。所以我猜在授权完成后,用户在被重定向到 ScreenA/ScreenB 之前被重定向回 LandingPage 一秒钟(但没有任何方法,如创建、启动、init 被再次调用) - 我我真的一无所知。
我理想情况下想要的是,如果在前一个屏幕逻辑仍在处理中时无法将用户引导到另一个屏幕,也许我可以阻止用户至少再次看到登录页面视图(这可能会让他认为应用程序有问题),而是向他显示“正在处理...”之类的警报,或者在他成功重定向到 ScreenA/ScreenB 之前替换着陆页的当前视图?
如果有人可以在这里指导我,我将不胜感激。
问候, 马赫克