Je suis ceci Tutorial mais jusqu'ici je ne peux pas le faire fonctionner, bien que cela soit d'un an ou plus ...
J'utilise androidStudo 1.2.2 et FacebookSDK 4.
Je souhaite une connexion simple à Facebook à l'aide d'un bouton personnalisé, similaire à celui présenté dans cette image:
Maintenant, dans l'exemple du tutoriel, j'ai des problèmes avec la variable Session
, il est dit qu'il ne peut pas le résoudre, ni getActivity()
Est-ce que quelqu'un a déjà essayé sur FacebookSDK4.0?
Est-ce une approche correcte ou peut-être qu'il y a quelque chose de plus à jour?
Merci d'avance!
Étape 1: Ajoutez d'abord FrameLayout et faites en sorte que le bouton facebook soit visible = "disparu" et ajoutez votre bouton personnalisé. N'oubliez pas de mettre xmlns:facebook="http://schemas.Android.com/apk/res-auto"
dans votre mise en page principale.
<FrameLayout
Android:id="@+id/FrameLayout1"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" >
<com.facebook.login.widget.LoginButton
Android:id="@+id/login_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:visibility="gone" />
<Button
Android:id="@+id/fb"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="#416BC1"
Android:onClick="onClick"
Android:text="FaceBook"
Android:textColor="#ffffff"
Android:textStyle="bold" />
</FrameLayout>
Étape 2: Initialisez FacebookSdk
dans onCreate
avant d’infléchir la mise en page.
FacebookSdk.sdkInitialize (this.getApplicationContext ());
Étape 3: ajoutez ceci dans votre fichier Java.
callbackManager = CallbackManager.Factory.create();
fb = (Button) findViewById(R.id.fb);
loginButton = (LoginButton) findViewById(R.id.login_button);
List < String > permissionNeeds = Arrays.asList("user_photos", "email",
"user_birthday", "public_profile", "AccessToken");
loginButton.registerCallback(callbackManager,
new FacebookCallback < LoginResult > () {@Override
public void onSuccess(LoginResult loginResult) {
System.out.println("onSuccess");
String accessToken = loginResult.getAccessToken()
.getToken();
Log.i("accessToken", accessToken);
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {@Override
public void onCompleted(JSONObject object,
GraphResponse response) {
Log.i("LoginActivity",
response.toString());
try {
id = object.getString("id");
try {
URL profile_pic = new URL(
"http://graph.facebook.com/" + id + "/picture?type=large");
Log.i("profile_pic",
profile_pic + "");
} catch (MalformedURLException e) {
e.printStackTrace();
}
name = object.getString("name");
email = object.getString("email");
gender = object.getString("gender");
birthday = object.getString("birthday");
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields",
"id,name,email,gender, birthday");
request.setParameters(parameters);
request.executeAsync();
}
@Override
public void onCancel() {
System.out.println("onCancel");
}
@Override
public void onError(FacebookException exception) {
System.out.println("onError");
Log.v("LoginActivity", exception.getCause().toString());
}
});
Étape 4: N'oubliez pas d'ajouter le code suivant.
@Override
protected void onActivityResult(int requestCode, int responseCode,
Intent data) {
super.onActivityResult(requestCode, responseCode, data);
callbackManager.onActivityResult(requestCode, responseCode, data);
}
Étape 5: Définissez votre bouton personnalisé, cliquez sur FacebookLogin.
public void onClick(View v) {
if (v == fb) {
loginButton.performClick();
}
}
Étape 6: Pour la déconnexion par programme, utilisez ceci.
LoginManager.getInstance (). LogOut ();
Étape 7: vous pouvez trouver un utilisateur connecté ou non par profil.
profile = Profile.getCurrentProfile().getCurrentProfile();
if (profile != null) {
// user has logged in
} else {
// user has not logged in
}
IMO une partie de la réponse sélectionnée est une sorte de solution de contournement pas la solution appropriée. Donc, ce qui doit être changé pour le rendre approprié est le suivant:
Débarrassez-vous de "com.facebook.login.widget.LoginButton" dans votre XML
<com.facebook.login.widget.LoginButton
Android:id="@+id/login_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:visibility="gone" />
Supprimez toutes les références au "LoginButton" dans votre Java code
tilisez la classe "LoginManager" de Facebook qui existe à cet effet comme suit:
@Override
protected void onCreate(Bundle savedInstanceState) {
// Some code
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(
callbackManager,
new FacebookCallback < LoginResult > () {
@Override
public void onSuccess(LoginResult loginResult) {
// Handle success
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
}
);
}
public void onClick(View v) {
if (v == fb) {
LoginManager.getInstance().logInWithReadPermissions(
this,
Arrays.asList("user_photos", "email", "user_birthday", "public_profile")
);
}
}
// this part was missing thanks to wesely
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
C'est très simple. Ajouter un bouton dans le fichier de mise en page comme
<Button
Android:layout_width="200dp"
Android:layout_height="wrap_content"
Android:text="Login with facebook"
Android:textColor="#ffff"
Android:layout_gravity="center"
Android:textStyle="bold"
Android:onClick="fbLogin"
Android:background="@color/colorPrimary"/>
Et dans la zone onClick, la méthode registercallback () de LoginManager indique que cette méthode s'exécute automatiquement.
comme:
public void fbLogin(View view)
{
// Before Edit:
// LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts" , "AccessToken"));
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("user_photos", "email", "public_profile", "user_posts"));
LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList("publish_actions"));
LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>()
{
@Override
public void onSuccess(LoginResult loginResult)
{
// App code
}
@Override
public void onCancel()
{
// App code
}
@Override
public void onError(FacebookException exception)
{
// App code
}
});
}
S'amuser
(ne pas avoir assez de réputation pour ajouter un commentaire ...)
J'ai essayé la réponse de @ Shehabix, je ne peux pas recevoir de rappel jusqu'à ce que j'ajoute ceci
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
alors cela fonctionne bien.
facebookButton.performClick()
inside cutomBtn.setOnClickListener
<!-- connect with Facebook -->
<RelativeLayout
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<com.facebook.login.widget.LoginButton
Android:id="@+id/fb_connect"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:textSize="@dimen/login_fb_font_size"
Android:visibility="invisible" />
<LinearLayout
Android:id="@+id/mfb_connect"
style="@style/facebook_button">
<ImageView
style="@style/login_connect_icon"
Android:src="@drawable/ic_facebook" />
<TextView
style="@style/login_connect_text"
Android:text="@string/login_connect_facebook" />
</LinearLayout>
</RelativeLayout>
...
private LoginButton fb_connect;
private LinearLayout mfb_connect;
...
// the button from facebook sdk
fb_connect = (LoginButton) findViewById(R.id.fb_connect);
// handle the click from my custom button to perfrom action click on facebook sdk button
mfb_connect = (LinearLayout) findViewById(R.id.mfb_connect);
mfb_connect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fb_connect.performClick();
}
});
Pour compléter les réponses de Harvi et Shehabix, je suggérerais d’ajouter cette méthode car elle enregistre l’authentification dans Firebase Auth.
Cette méthode doit être appelée dans "En cas de succès" de LoginManager
.
private void handleFacebookAccessToken(AccessToken token) {
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
//Toast.makeText(MainActivity.this, "Autenticando",Toast.LENGTH_SHORT).show();
} else {
// If sign in fails, display a message to the user.
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
//updateUI(null);
}
}
});
}