簡體   English   中英

沒有登錄按鈕的 Facebook 身份驗證

[英]Facebook authentication without login button

我遵循了一些 Facebook API 3.0 教程,包括登錄/注銷和發布到供稿示例。 所以登錄是這樣工作的:

  1. 應用程序打開,顯示一個顯示登錄按鈕的片段
  2. 用戶單擊登錄,身份驗證通過引用的 FacebookSDK 庫 (com.facebook.widget.LoginActivity) 和使用會話提供的代碼完成。
  3. 用戶被重定向到下一個屏幕

我不想讓用戶以這種方式登錄。 我希望他們在沒有任何登錄/注冊的情況下使用我的應用程序,然后如果他們點擊 Facebook 特定功能,例如在 Facebook 上分享便箋,那么應用程序應該詢問他們是否讓 Facebook 使用他們的應用程序或其他什么,你知道通常的東西. 沒有這個,我在 publishFeedDialog() 函數中得到一個空指針,因為會話為空,因為沒有登錄。

所以我的問題是,如何使用登錄按鈕忽略 SplashFragment,因此當用戶單擊我的應用程序中的 Facebook 功能時,不會顯示帶有登錄按鈕的新屏幕,而僅顯示用戶使用的默認 Facebook 身份驗證窗口到?

@erdomester,@sromku

Facebook 推出新的 sdk 版本 4.x,其中 Session 已棄用,

有來自 facebook 的登錄新概念

LoginManager 和 AccessToken - 這些新類執行 Facebook 登錄

因此,現在您無需登錄按鈕即可訪問 Facebook 身份驗證

布局文件

    <Button
            android:id="@+id/btn_fb_login"
            .../>

主活動.java

private CallbackManager mCallbackManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FacebookSdk.sdkInitialize(this.getApplicationContext());

    mCallbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    Log.d("Success", "Login");

                }

                @Override
                public void onCancel() {
                    Toast.makeText(MainActivity.this, "Login Cancel", Toast.LENGTH_LONG).show();
                }

                @Override
                public void onError(FacebookException exception) {
                    Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
                }
            });

    setContentView(R.layout.activity_main);

    Button btn_fb_login = (Button)findViewById(R.id.btn_fb_login);

    btn_fb_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
              LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
        }
    });

}

編輯

如果您不添加以下內容,它將不起作用( @Daniel Zolnai在下面的評論中正確指出):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
        return;
    }
}

像這樣的東西

private void performFacebookLogin()
{
    Log.d("FACEBOOK", "performFacebookLogin");
    final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, Arrays.asList("email"));
    Session openActiveSession = Session.openActiveSession(this, true, new Session.StatusCallback()
    {
        @Override
        public void call(Session session, SessionState state, Exception exception)
        {
            Log.d("FACEBOOK", "call");
            if (session.isOpened() && !isFetching)
            {
                Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
                isFetching = true;
                session.requestNewReadPermissions(newPermissionsRequest);
                Request getMe = Request.newMeRequest(session, new GraphUserCallback()
                {
                    @Override
                    public void onCompleted(GraphUser user, Response response)
                    {
                        Log.d("FACEBOOK", "onCompleted");
                        if (user != null)
                        {
                            Log.d("FACEBOOK", "user != null");
                            org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
                            String email = graphResponse.optString("email");
                            String id = graphResponse.optString("id");
                            String facebookName = user.getUsername();
                            if (email == null || email.length() < 0)
                            {
                                Logic.showAlert(
                                        ActivityLogin.this,
                                        "Facebook Login",
                                        "An email address is required for your account, we could not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.");
                                return;
                            }
                        }
                    }
                });
                getMe.executeAsync();
            }
            else
            {
                if (!session.isOpened())
                    Log.d("FACEBOOK", "!session.isOpened()");
                else
                    Log.d("FACEBOOK", "isFetching");

            }
        }
    });

其實正是如此。 它對我來說非常好。

這對我有用

    import android.os.Bundle;
    import android.app.Activity;
    import android.content.Intent;
    import android.widget.TextView;
    import com.facebook.*;
    import com.facebook.model.*;

    public class MainActivity extends Activity {

      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // start Facebook Login
        Session.openActiveSession(this, true, new Session.StatusCallback() {

          // callback when session changes state
          @Override
          public void call(Session session, SessionState state, Exception exception) {
            if (session.isOpened()) {

              // make request to the /me API
              Request.newMeRequest(session, new Request.GraphUserCallback() {

                // callback after Graph API response with user object
                @Override
                public void onCompleted(GraphUser user, Response response) {
                  if (user != null) {
                    TextView welcome = (TextView) findViewById(R.id.welcome);
                    welcome.setText("Hello " + user.getName() + "!");
                  }
                }
              }).executeAsync();
            }
          }
        });
      }

      @Override
      public void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
      }

    }

如果您需要在驗證會話打開后獲得授權,請添加以下方式:

List<String> permissions = session.getPermissions();             
                 Session.NewPermissionsRequest newPermissionsRequest = new         Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
                 session.requestNewReadPermissions(newPermissionsRequest);

這個簡單的庫可以幫助你: https : //github.com/sromku/android-simple-facebook

只需將此庫添加到您的項目,並從此庫引用 Facebook SDK 3.0.x,並將您的應用程序引用添加到此庫。

然后,您可以在沒有LoginButton情況下登錄並執行簡單的操作,例如發布提要、獲取個人資料/朋友、發送邀請等等。

這是登錄的樣子:

OnLoginOutListener onLoginOutListener = new SimpleFacebook.OnLoginOutListener()
{

    @Override
    public void onFail()
    {
        Log.w(TAG, "Failed to login");
    }

    @Override
    public void onException(Throwable throwable)
    {
        Log.e(TAG, "Bad thing happened", throwable);
    }

    @Override
    public void onThinking()
    {
        // show progress bar or something to the user while login is happening
        Log.i(TAG, "In progress");
    }

    @Override
    public void onLogout()
    {
        // change the state of the button or do whatever you want
        Log.i(TAG, "Logged out");
    }

    @Override
    public void onLogin()
    {
        // change the state of the button or do whatever you want
        Log.i(TAG, "Logged in");
    }
};

// set login/logut listener
mSimpleFacebook.setLogInOutListener(onLoginOutListener);

// do the login action
mSimpleFacebook.login(MainActivity.this);


然后,在onLogin()回調方法中,您可以像這樣發布提要:

// build feed
Feed feed = new Feed.Builder()
    .setMessage("Clone it out...")
    .setName("Simple Facebook for Android")
    .setCaption("Code less, do the same.")
    .setDescription("The Simple Facebook library project makes the life much easier by coding less code for being able to login, publish feeds and open graph stories, invite friends and more.")
    .setPicture("https://raw.github.com/sromku/android-simple-facebook/master/Refs/android_facebook_sdk_logo.png")
    .setLink("https://github.com/sromku/android-simple-facebook")
    .build();

// publish the feed
mSimpleFacebook.publish(feed);

希望它可以幫助你。

不使用 LoginButton 訪問 FB 詳細信息的 Turnaroubd 是

1) 隱藏您的登錄按鈕 UI

2)添加您的自定義按鈕

Button signup = (Button) view.findViewById(R.id.btn_signup);
        signup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loginButton.performClick();//Where loginButton is Facebook UI
            }
        });

但我建議使用 LoginManager

您可以使用 Node 驅動的facebook-proxy模塊繞過登錄對話框。 使用一鍵部署按鈕在 Heroku 上創建您自己的實例。

它的主要作用是:

  1. 從 Facebook 請求access_token
  2. 使用express-http-proxy打開代理服務器
  3. 讓我們請求 API 的所有端點

您可以更改放置 Facebook 按鈕並更改可見性。 例如 :

<FrameLayout
            android:id="@+id/frameLayout_facebook"
            android:layout_width="0dp"
            android:layout_height="wrap_content">

            <com.google.android.material.button.MaterialButton
                android:id="@+id/button_continue_facebook"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/continue_with_facebook" />

            <com.facebook.login.widget.LoginButton
                android:id="@+id/loginButton_facebook"
                android:visibility="gone"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

 </FrameLayout>

之后,在您的代碼中(此處為 Kotlin),當有人單擊您的 Button 時,您可以調用 Facebook SDK 的 onClick() 方法:

 button_continue_facebook.setOnClickListener {
            binding.loginButton_facebook.callOnClick()
}

暫無
暫無

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

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