[英]Facebook authentication without login button
我遵循了一些 Facebook API 3.0 教程,包括登錄/注銷和發布到供稿示例。 所以登錄是這樣工作的:
我不想讓用戶以這種方式登錄。 我希望他們在沒有任何登錄/注冊的情況下使用我的應用程序,然后如果他們點擊 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 上創建您自己的實例。
它的主要作用是:
access_token
express-http-proxy
打開代理服務器您可以更改放置 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.