web-dev-qa-db-ja.com

ログインボタンなしのFacebook認証

Login/LogoutやPublish To Feedの例など、Facebook API 3.0のチュートリアルをいくつかフォローしました。したがって、ログインは次のように機能します。

  1. アプリが開き、ログインボタンを表示するフラグメントが表示されます
  2. ユーザーがログインをクリックすると、参照されたFacebookSDKライブラリ(com.facebook.widget.LoginActivity)およびセッションを使用して提供されたコードを介して認証が行われます。
  3. ユーザーは次の画面にリダイレクトされます

ユーザーにこの方法でログインさせたくありません。ログイン/登録せずにアプリを使用してもらい、Facebook固有の機能(例: Facebookでメモを共有したら、アプリはFacebookにアプリを使用させるかどうかを尋ねる必要があります。これがなければ、ログインが行われていないため、セッションがnullであるため、publishFeedDialog()関数でnullポインタを取得します。

だから私の質問は、ログインボタンでSplashFragmentをどのように無視できるのですか?ユーザーが私のアプリのFacebook機能をクリックすると、ログインボタンのある新しい画面は表示されず、ユーザーが使用されるデフォルトのFacebook認証ウィンドウのみですに?

48
erdomester

@ erdomester、@ sromku

Facebookは、セッションが廃止された新しいSDKバージョン4.xをリリースしました。

Facebookからのログインの新しいコンセプトがあります

LoginManagerおよびAccessToken -これらの新しいクラスはFacebookログインを実行します

そのため、ログインボタンなしでFacebook認証にアクセスできます。

layout.xml

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

MainActivity.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;
    }
}
89
TejaDroid

このようなもの

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");

            }
        }
    });

実際にそのように。それは私にとって完璧に動作します。

9
WIllJBD

これは私のために働いた

    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);
3
Dany19

このシンプルなライブラリはあなたを助けることができます: 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);
_

それがあなたを助けることを願っています。

2
sromku

LoginButtonを使用してFBの詳細にアクセスするためのTurnaroubdは

1)LoginButton 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を使用することをお勧めします

2
Raghavendra B

Node powered facebook-proxy モジュールを使用してログインダイアログをバイパスできます。ワンクリック展開ボタンを使用してHerokuに独自のインスタンスを作成します。

それが基本的にすること:

  1. Facebookからaccess_tokenをリクエストします
  2. express-http-proxyを使用してプロキシサーバーを開きます
  3. APIのすべてのエンドポイントをリクエストしましょう
0
redaxmedia