簡體   English   中英

使用 Facebook 登錄,無需登錄按鈕 Android

[英]Login With Facebook without Login Button Android

嗨,我正在使用 facebook 創建登錄,但沒有登錄按鈕。 它工作正常,但在關閉 facbook webkit 登錄表單時,它再次打開彈出請求許可。 給我解決方案。

    private void FacebookLogin() {
    // TODO Auto-generated method stub

    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) {

                    if (session.isOpened()) {
                        session.requestNewReadPermissions(newPermissionsRequest);
                        Request getMe = Request.newMeRequest(session,
                                new GraphUserCallback() {
                                    @Override
                                    public void onCompleted(GraphUser user,
                                            Response response) {
                                        if (user != null) {
                                            org.json.JSONObject graphResponse = response
                                                    .getGraphObject()
                                                    .getInnerJSONObject();
                                            String email = graphResponse
                                                    .optString("email");
                                            String id = graphResponse
                                                    .optString("id");
                                        }
                                    }
                                });
                        getMe.executeAsync();
                    } else {
                        if (!session.isOpened())
                            Log.d("FACEBOOK", "!session.isOpened()");
                        else
                            Log.d("FACEBOOK", "isFetching");

                    }
                }
            });


}

@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
    // TODO Auto-generated method stub
    super.onActivityResult(arg0, arg1, arg2);
    Session.getActiveSession().onActivityResult(this, arg0, arg1, arg2);
}

我找到了兩種方法。

第一個 - 您添加到 XML facebook 按鈕並隱藏(設置可見性 = GONE)它。 初始化此按鈕並在您自定義事件調用 facebookButton.performClick();

第二種方式 - 使用這部分代碼:

callbackManager = CallbackManager.Factory.create();
    List<String> permission = new ArrayList<String>();
    permission.add("email");
    LoginManager loginManager = LoginManager.getInstance();

    loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            if (facebookDialog.isShowing()) {
                loadingProgressBar.setVisibility(View.VISIBLE);
                singViaFacebook.setText(R.string.dialog_facebook_loggin);
            }
            loadProfile();
        }

        @Override
        public void onCancel() {
            lockLoginButton(true);
            startTimer();
        }

        @Override
        public void onError(FacebookException exception) {
            lockLoginButton(true);
            startTimer();
        }
    });

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

當你想調用彈出窗口時調用這段代碼:

loginManager.logInWithReadPermissions(this, permission)

適用於 Facebook SDK [4,5)

首先聲明回調管理器,例如,

私人 CallbackManager callbackManager;

私有訪問令牌訪問令牌;

將此代碼放入 OnCreate()::

callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

        @Override
        public void onSuccess(LoginResult loginResult) {
            accessToken = loginResult.getAccessToken();
            getFacebookUserProfile(accessToken);
        }

        @Override
        public void onCancel() {
            Toast.makeText(StartUpActivity.this, "Login with facebook canceled.", Toast.LENGTH_LONG).show();
        }

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

然后將點擊分配給您的按鈕,例如,

btnFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                accessToken = AccessToken.getCurrentAccessToken();
                if (accessToken != null) {
                    getFacebookUserProfile(accessToken);
                } else {
                    LoginManager.getInstance().logInWithReadPermissions(StartUpActivity.this, Arrays.asList("public_profile", "email"));
                }
            }
        });

然后覆蓋,

@Override                                                                     
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == CallbackManagerImpl.RequestCodeOffset.Login.toRequestCode()) {
            callbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }

然后使用此功能獲取用戶個人資料,

private void getFacebookUserProfile(AccessToken accessToken) {
        GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {

            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                try {
                    authenticateUser(object);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

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

希望這對你有用

嘗試這個

    public class LoginFragment extends Fragment{
        boolean isFetching = false;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View view = inflater.inflate(R.layout.login_fragment, null);

                Button button = (Button) view.findViewById(R.id.login_button);
                button.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        performFacebookLogin();
                    }
                });
                return view;
            }
            private void performFacebookLogin()
            {
                Log.d("FACEBOOK", "performFacebookLogin");
                final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("email"));
                Session openActiveSession = Session.openActiveSession(getActivity(), 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)
                                        {
                                            Toast.makeText(getActivity(), 
                                                    "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.", Toast.LENGTH_LONG).show();
                                            return;
                                        }
                                    }
                                }
                            });
                            getMe.executeAsync();
                        }
                        else
                        {
                            if (!session.isOpened())
                                Log.d("FACEBOOK", "!session.isOpened()");
                            else
                                Log.d("FACEBOOK", "isFetching");

                        }
                    }

                });

}
}

現在在你的片段布局中添加一個按鈕

<Button
    android:id="@+id/login_button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Login With Facebook" />

它對我有用,只有一次彈出請求權限嘗試它並讓我知道

暫無
暫無

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

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