J'ai suivi certains tutoriels de Facebook API 3.0, notamment les exemples Connexion/Déconnexion et Publier dans le fil. Donc, le login fonctionne de cette façon:
Je ne veux pas que l'utilisateur se connecte de cette façon. Je veux qu'ils utilisent mon application sans aucun login/enregistrement, puis s'ils cliquent sur une fonctionnalité spécifique de Facebook, par exemple. partager une note sur Facebook, l’application devrait leur demander s’ils permettent à Facebook d’utiliser leur application ou quelque chose du genre, vous connaissez le genre de choses habituelles. Sans cela, j'obtiens un nullpointer dans la fonction publishFeedDialog () car la session est nulle, car aucun login n'a été créé.
Ma question est donc la suivante: comment ignorer le SplashFragment avec le bouton de connexion? Ainsi, lorsque l'utilisateur clique sur une fonctionnalité de Facebook dans mon application, aucun nouvel écran ne s'affiche avec un bouton de connexion, mais uniquement la fenêtre d'authentification Facebook par défaut utilisée par les utilisateurs. à?
@erdomester, @sromku
Facebook lance le nouveau sdk version 4.x où Session est obsolète,
Il nouveau concept de connexion à partir de facebook
LoginManager et AccessToken - Ces nouvelles classes exécutent Facebook S'identifier
Alors, maintenant, vous pouvez accéder à l’authentification Facebook sans le bouton de connexion
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"));
}
});
}
Si vous n’ajoutez pas ce qui suit, cela ne fonctionnera pas (signalé à juste titre par @Daniel Zolnai dans le commentaire ci-dessous):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
return;
}
}
Quelque chose comme ça
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");
}
}
});
En fait, exactement comme ça. Cela fonctionne parfaitement bien pour moi.
Cela a fonctionné pour moi
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);
}
}
si vous devez obtenir des autorisations après avoir vérifié que la session est ouverte, ajoutez cette méthode:
List<String> permissions = session.getPermissions();
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
session.requestNewReadPermissions(newPermissionsRequest);
Cette bibliothèque simple peut vous aider: https://github.com/sromku/Android-simple-facebook
Ajoutez simplement cette bibliothèque à votre projet et faites référence de cette bibliothèque à Facebook SDK 3.0.x, puis ajoutez une référence de votre application à cette bibliothèque.
Ensuite, vous pouvez vous connecter sans la LoginButton
et effectuer des actions simples comme publier des flux, obtenir un profil/des amis, envoyer une invitation, etc.
Voici à quoi ressemble le 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);
Ensuite, dans la méthode de rappel onLogin()
, vous pouvez publier le flux de la manière suivante:
// 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);
J'espère que ça peut t'aider.
Un délai pour accéder aux détails du FB sans utiliser le bouton de connexion est
1) Cacher votre LoginButton UI
2) Ajoutez votre bouton personnalisé
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
}
});
Mais je suggère d'utiliser LoginManager
Vous pouvez ignorer la boîte de dialogue de connexion à l'aide du module Node powered facebook-proxy . Créez votre propre instance sur Heroku en utilisant le bouton de déploiement en un clic.
Qu'est-ce qu'il fait fondamentalement:
access_token
à Facebookexpress-http-proxy