簡體   English   中英

成功登錄android facebook應用程序並在新頁面上獲取注銷按鈕后如何開始新活動並隱藏登錄頁面

[英]How to start a new activity and hide login page after successful login in android facebook app and get logout button on new page

我正在將 facebook 應用程序與我的 android 應用程序集成,我不想執行 android facebook 應用程序的默認行為,即成功登錄后我不想回到同一個登錄頁面並在那里獲得注銷按鈕。 成功登錄后,它會快速啟動一個具有注銷按鈕的新活動,並且登錄頁面不會出現在從登錄返回時。 這是我的主要活動 Java 類代碼:

package com.example.facebook;

import java.util.Arrays;
import java.util.List;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.UserInfoChangedCallback;

public class MainActivity extends FragmentActivity {

    private LoginButton loginBtn;
    private Button postImageBtn;
    private Button updateStatusBtn;

    private TextView userName;

    private UiLifecycleHelper uiHelper;

    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");

    private static String message = "Sample status posted from android app";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        
        uiHelper = new UiLifecycleHelper(this, statusCallback);
        uiHelper.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
    
    

        userName = (TextView) findViewById(R.id.user_name);
        loginBtn = (LoginButton) findViewById(R.id.fb_login_button);
        loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                if (user != null) {
                    
                    userName.setText("Hello, " + user.getName());
                } else {
                    userName.setText("You are not logged");
                }
            }
        });
        
        

        postImageBtn = (Button) findViewById(R.id.post_image);
        postImageBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                postImage();
            }
});

        updateStatusBtn = (Button) findViewById(R.id.update_status);
        updateStatusBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
        });

        buttonsEnabled(false);
    }

    private Session.StatusCallback statusCallback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            if (state.isOpened()) {
                buttonsEnabled(true);
                 if (Session.getActiveSession() != null || Session.getActiveSession().isOpened()){
                     Intent i = new Intent(MainActivity.this,nextscreen.class);
                    startActivity(i);
                }
        
        
                Log.d("FacebookSampleActivity", "Facebook session opened");
            } else if (state.isClosed()) {
                buttonsEnabled(false);
                
                Log.d("FacebookSampleActivity", "Facebook session closed");
            }
        }
    };

    public void buttonsEnabled(boolean isEnabled) {
    
        postImageBtn.setEnabled(isEnabled);
        updateStatusBtn.setEnabled(isEnabled);
    }

    public void postImage() {
        if (checkPermissions()) {
            Bitmap img = BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_launcher);
            Request uploadRequest = Request.newUploadPhotoRequest(
                    Session.getActiveSession(), img, new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                        Toast.makeText(MainActivity.this,
                                    "Photo uploaded successfully",
                                    Toast.LENGTH_LONG).show();
                        }
                });
            uploadRequest.executeAsync();
        } else {
            requestPermissions();
}
    }

    public void postStatusMessage() {
        if (checkPermissions()) {
            Request request = Request.newStatusUpdateRequest(
                    Session.getActiveSession(), message,
                    new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            if (response.getError() == null)
                                Toast.makeText(MainActivity.this,
                                        "Status updated successfully",
                                        Toast.LENGTH_LONG).show();
                        }
                    });
            request.executeAsync();
        } else {
            requestPermissions();
        }
    }

    public boolean checkPermissions() {
        Session s = Session.getActiveSession();
        if (s != null) {
            return s.getPermissions().contains("publish_actions");
        } else
            return false;
    }

    public void requestPermissions() {
        Session s = Session.getActiveSession();
        if (s != null)
            s.requestNewPublishPermissions(new Session.NewPermissionsRequest(
                    this, PERMISSIONS));
    }

    @Override
    public void onResume() {
        super.onResume();
        uiHelper.onResume();
    //  buttonsEnabled(Session.getActiveSession().isOpened());
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
    //  Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
        // if (Session.getActiveSession() != null || Session.getActiveSession().isOpened()){
         //    Intent i = new Intent(MainActivity.this,nextscreen.class);
          //  startActivity(i);
      //  }
        
        
        
    }
    

    @Override
    public void onSaveInstanceState(Bundle savedState) {
        super.onSaveInstanceState(savedState);
        uiHelper.onSaveInstanceState(savedState);
    }

}

if (state.isOpened())方法中應用 activity(intent) 后,它會在登錄頁面上返回我一段時間,並有注銷按鈕,然后自己跳轉到新的活動。 但我不想那樣。 我想返回一個有注銷按鈕的新活動,不想再次顯示登錄頁面,點擊新活動上的注銷按鈕,我想要登錄頁面。

Facebook 登錄按鈕,如果您成功登錄。 它將措辭從“登錄 Facebook”更改為“注銷”。 如果您不想看到它,只需將 Visibility GONE 或 Intent 設置為所需的活動。 如果您使用意圖,請設置如下標志

Intent next = new Intent(getApplicationContext(), MenuActivity.class);
next.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(next);

下面是facebook登錄按鈕的示例

loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

            @Override
            public void onSuccess(LoginResult loginResult) {
                GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), (object, response) -> {
                    // hide this facebook login button
                    // Intent to your desired activity

                });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id,name,email,birthday,gender,first_name,last_name");
                request.setParameters(parameters);
                request.executeAsync();
            }

            @Override
            public void onCancel() {
                Toast.makeText(getApplicationContext(), Message.LOGINCANCEL, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(FacebookException e) {
                Toast.makeText(getApplicationContext(), Message.LOGINFAILED, Toast.LENGTH_SHORT).show();
            }
        });

如果您想將“注銷”facebook 按鈕更改為“登錄 Facebook”,請使用以下代碼。 只需創建 BUtton 並執行 onClick() 即可觸發以下代碼

if (AccessToken.getCurrentAccessToken() != null && com.facebook.Profile.getCurrentProfile() != null){
    LoginManager.getInstance().logOut();
}

我也面臨同樣的問題,到目前為止還沒有找到任何解決方案。 但我在那里使用解決方法。 我在 Facebook 回調方法上顯示 ProgressDialog,因此用戶至少可以理解 Facebook 成功登錄后再次加載登錄活動時發生的一些事情。

以下是代碼:-

private void onSessionStateChange(Session session, SessionState state,
        Exception exception) {

    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");

        //------ Show loading progress
        ProgressDialog dialog = ProgressDialog.show(LoginPopup.this, "Please wait...", "Retrieving data ...", true);
        LinearLayout layout = (LinearLayout) findViewById(R.id.LayoutLoginPopup);
        layout.setEnabled(false);
        LinearLayout layout_LayoutLogin = (LinearLayout) findViewById(R.id.LayoutLogin);
        layout_LayoutLogin.setEnabled(false);
        //------ End Show loading progress
        Request.newMeRequest(session, new Request.GraphUserCallback() {

            // callback after Graph API response with user object
            @Override
            public void onCompleted(GraphUser user, Response response) {
                // TODO Auto-generated method stub

                FacebookRequestError error = response.getError();
                if (error != null) {
                    Log.e(TAG, error.toString());
                    // handleError(error, true);
                    return;
                }

                if (user != null) {
                    // Display the parsed user info
                    buildUserInfoDisplay(user, response, bar);

                } else {
                    Log.d(TAG, "Failed to login");
                    bar.setVisibility(View.INVISIBLE);
                    Utils.showAlert(LoginPopup.this, "Message",
                            "Failed to login!");
                }

            }
        }).executeAsync();

    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
        // Toast.makeText(Login.this, "Logged out...", Toast.LENGTH_SHORT)
        // .show();
    }

    //------ Hide loading progress
    //ProgressDialog dialog = ProgressDialog.show(LoginPopup.this, "", "Loading...", true);
    LinearLayout layout = (LinearLayout) findViewById(R.id.LayoutLoginPopup);
    layout.setEnabled(true);
    LinearLayout layout_LayoutLogin = (LinearLayout) findViewById(R.id.LayoutLogin);
    layout.setEnabled(true);
    //------ End Hide loading progress
}

我所做的是使用 sharedPreferrence 在設備上存儲一個包含名為 isLoggedIn 的值的文件。 當用戶登錄時,我將此值設置為 true,然后在他/她按下注銷按鈕時清除該值。 所以每當我啟動我的應用程序時,我首先檢查該值是否為真。 如果為真,則轉到下一個活動,否則,留在登錄頁面。

仍在嘗試找出如何以專業的方式解決問題。 一切順利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM