当我在Android注销后尝试重新登录时,为什么没有出现Facebook登录页面?

时间:2012-11-21 15:18:29

标签: android facebook

我按照本教程http://www.androidhive.info/2012/03/android-facebook-connect-tutorial/将Facebook连接到我的Android应用程序。我有一个按钮,用于登录和注销,而不是有很多按钮。

1)我第一次运行课程时,可以登录然后成功注销。当我点击相同的按钮再次登录时,登录页面不会出现,但是出现了Toa​​st文本“LOGGING IN”,这是在我的 loginToFacebook()功能之后的if-else 即可。因此,我认为它应该像我第一次运行类一样运行facebook登录页面。但登录页面不会出现。

我做错了什么?我该怎么办?

2)如何在登录后在String fbLoggedIn中显示用户名而不是文本“CONNECTED !!” ?

public class FacebookActivity extends Activity{

private static String APP_ID = "";
private Facebook facebook;
private AsyncFacebookRunner mAsyncRunner;
String FILENAME = "AndroidSSO_data";
private SharedPreferences mPrefs;
private Button backButton;
private String name = "CONNECTED!!";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.settings_share);

    facebook = new Facebook(APP_ID);
    mAsyncRunner = new AsyncFacebookRunner(facebook);

    RelativeLayout fbButton = (RelativeLayout) findViewById(R.id.fbLayout);
    fbButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (!facebook.isSessionValid())
            {
            System.out.println("Not Connected. Clicked and Login.");    
            loginToFacebook();
            Toast.makeText(getApplicationContext(), "LOGGING IN", Toast.LENGTH_LONG).show();}

            else
            {
            System.out.println("Connected. Logged Out.");   
            logoutFromFacebook();
            Toast.makeText(getApplicationContext(), "LOGGED OUT", Toast.LENGTH_LONG).show();}
        }
    });     
}

public void loginToFacebook() {
    mPrefs = getPreferences(MODE_PRIVATE);
    String access_token = mPrefs.getString("access_token", null);
    long expires = mPrefs.getLong("access_expires", 0);

    if (access_token != null) {
        facebook.setAccessToken(access_token);
    }

    if (expires != 0) {
        facebook.setAccessExpires(expires);
    }

    if (!facebook.isSessionValid()) {   

        facebook.authorize(this, new String[] { "email", "publish_stream" }, new DialogListener() {

                    @Override
                    public void onCancel() {
                        // Function to handle cancel event
                    }

                    @Override
                    public void onComplete(Bundle values) {
                        // Function to handle complete event
                        // Edit Preferences and update facebook acess_token
                        SharedPreferences.Editor editor = mPrefs.edit();
                        editor.putString("access_token", facebook.getAccessToken());
                        editor.putLong("access_expires", facebook.getAccessExpires());
                        editor.commit();   

                        TextView fbUser = (TextView) findViewById(R.id.fbUser);
                        fbUser.setVisibility(View.VISIBLE);
                        String fbLoggedIn = name;
                        fbUser.setText(fbLoggedIn); 
                        Toast.makeText(getApplicationContext(), "LOGGED IN AS " + name, Toast.LENGTH_LONG).show();         
                    }

                    @Override
                    public void onError(DialogError error) {
                        // Function to handle error
                    }

                    @Override
                    public void onFacebookError(FacebookError fberror) {
                        // Function to handle Facebook errors
                    }

                });
    }
}

public void getProfileInformation() {
    mAsyncRunner.request("me", new RequestListener() {
        @Override
        public void onComplete(String response, Object state) {
            Log.d("Profile", response);
            String json = response;
            try {
                JSONObject profile = new JSONObject(json);
                // getting name of the user
                final String name = profile.getString("name");
                // getting email of the user
                final String email = profile.getString("email");

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(), "Name: " + name + "\nEmail: " + email, Toast.LENGTH_LONG).show();
                    }

                });

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onIOException(IOException e, Object state) { }

        @Override
        public void onFileNotFoundException(FileNotFoundException e, Object state) { }

        @Override
        public void onMalformedURLException(MalformedURLException e, Object state) { }

        @Override
        public void onFacebookError(FacebookError e, Object state) { }
    });
}

//logout from Facebook
public void logoutFromFacebook() {
    mAsyncRunner.logout(this, new RequestListener() {
        @Override
        public void onComplete(String response, Object state) {
            Log.d("Logout from Facebook", response);
            if (Boolean.parseBoolean(response) == true) {
                // User successfully Logged out
         }

        }

        @Override
        public void onIOException(IOException e, Object state) { }

        @Override
        public void onFileNotFoundException(FileNotFoundException e, Object state) { }

        @Override
        public void onMalformedURLException(MalformedURLException e, Object state) { }

        @Override
        public void onFacebookError(FacebookError e, Object state) { }
    });
 }

为了更清楚,我设置了if-else这样的(从上面的完整代码中提取)。

    RelativeLayout fbButton = (RelativeLayout) findViewById(R.id.fbLayout);
    fbButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (!facebook.isSessionValid())
            {
            System.out.println("Not Connected. Clicked and Login.");    
            loginToFacebook();
            Toast.makeText(getApplicationContext(), "LOGGING IN", Toast.LENGTH_LONG).show();}

            else
            {
            System.out.println("Connected. Logged Out.");   
            logoutFromFacebook();
            Toast.makeText(getApplicationContext(), "LOGGED OUT", Toast.LENGTH_LONG).show();}
        }
    }); 

1 个答案:

答案 0 :(得分:0)

这是Facebook要求您使用其API的行为。您的登录方法会检查您是否已登录过一次并且facebook会话处于活动状态。如果会话处于活动状态,则它会设置facebook对象的属性并将其连接到sences后面,以便不再显示登录页面。

所以你没有做错任何事情,假设这样做。