1

我对 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 之前替换着陆页的当前视图?

如果有人可以在这里指导我,我将不胜感激。

问候, 马赫克

4

0 回答 0