没有loginbutton的Facebookauthentication

我遵循了一些Facebook API 3.0教程,其中包括login/注销和发布到源代码示例。 所以login按这种方式工作:

  1. 应用程序打开,显示一个显示loginbutton的片段
  2. 用户点击login,身份validation通过引用的FacebookSDK库(com.facebook.widget.LoginActivity)和使用会话提供的代码完成。
  3. 用户被redirect到下一个屏幕

我不想让用户以这种方式login。 我希望他们在没有任何login/注册的情况下使用我的应用程序,然后如果他们点击了Facebook的特定function,例如在Facebook上分享注释,那么应用程序应该问他们是否让Facebook使用他们的应用程序或其他东西,你知道通常的东西。 没有这个,我在publishFeedDialog()函数中得到一个空指针,因为session是空的,因为没有login。

所以我的问题是,我怎样才能用loginbutton忽略SplashFragment,所以当用户点击我的应用程序中的Facebookfunction,没有新的屏幕显示loginbutton,但只有用户使用默认的Facebook身份validation窗口至?

@erdomester,@sromku

Facebook推出新的sdk版本4.x,其中会议已弃用,

有从Facebooklogin的新概念

LoginManager和AccessToken – 这些新类执行Facebooklogin

所以,现在你可以访问Facebook身份validation而无需loginbutton

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; } } 

像这样的东西

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

如果您在validation会话打开后需要获得授权,请添加以下方法:

 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,并将您的应用程序的引用添加到此库。

然后,您可以login没有LoginButton并做简单的动作,如发布饲料,获得个人资料/朋友,发送邀请等。

这是login的样子:

 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()callback方法中,您可以像这样发布提要:

 // 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)隐藏您的LoginButton用户界面

2)添加您的自定义button

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

但我build议使用LoginManager

您可以使用Node powered facebook-proxy模块绕过login对话框。 使用一键部署button在Heroku上创build自己的实例。

它基本上做了什么:

  1. 从Facebook请求一个access_token
  2. 使用express-http-proxy打开代理服务器
  3. 让我们请求API的所有端点