简体   繁体   中英

facebook integration with latest Facebook Sdk in android studio

I am working on facebook integration in android. I googled and working on it. But i don't know why it is not working when i already have facebook app in my mobile. It is opening login page of facebook when i don't have facebook app in my mobile.

my code:

MainActivity:

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import android.util.Base64;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.provider.Settings;

import android.util.Log;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.Scope;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;

import org.json.JSONException;
import org.json.JSONObject;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Set;

public class MainActivity extends ActionBarActivity {
    Button fb_login;

    public static CallbackManager callbackmanager;
    //Signup signup_task = null;

    private boolean fb_signincllicked = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FacebookSdk.sdkInitialize(getApplicationContext());


        fb_login = (Button) findViewById(R.id.fb_login);
        fb_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onFblogin(true);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void onFblogin(boolean fb_btn) {

        fb_signincllicked = fb_btn;

        callbackmanager = CallbackManager.Factory.create();

        // Set permissions
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));

        LoginManager.getInstance().registerCallback(callbackmanager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.v("TAG_JSONOBJECT2", "" + "jsonObject");

                final Set<String> deniedPermissions = loginResult.getRecentlyDeniedPermissions();

                GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {

                    @Override
                    public void onCompleted(JSONObject json, GraphResponse response) {

                        if (response.getError() != null) {

                        } else {
                            try {

                                if (deniedPermissions.contains("email")) {
                                    LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("email"));
                                }

                                JSONObject jsonObject = new JSONObject();

                                jsonObject.put("full_name", json.getString("name"));
                                jsonObject.put("device_id", Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID));
                                jsonObject.put("fb_id", json.getString("id"));
                                jsonObject.put("signuptype", "1");

                               /* signup_task = new Signup(MainActivity.this);
                                if (signup_task.getStatus() != AsyncTask.Status.RUNNING) {
                                    signup_task.execute(jsonObject.toString());
                                    signup_task.signupcompleted = MainActivity.this;
                                }*/

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).executeAsync();
            }

            @Override
            public void onCancel() {
                Log.v("TAG_JSONOBJECTCANCEL", "" + "jsonObject");
                Log.d("Cancel", "On cancel");
            }

            @Override
            public void onError(FacebookException error) {
                Log.d("Error", error.toString());
            }
        });
    }
}

manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.al.name">

    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/fb_appid" />
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:name="com.al.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
    </application>

</manifest>

build gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    repositories {
        mavenCentral()
    }

    defaultConfig {
        applicationId "com.al.name"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile 'com.google.android.gms:play-services:7.3.0'
    compile 'com.facebook.android:facebook-android-sdk:4.5.0'
}

hash key generation code:

try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "package name", 
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }

I am using Facebook helper class for login.

FacebookHelper.java

public class FacebookHelper {

private static final String TAG = "FbHelper";
private Activity activity;
private StatusCallback statusCallback = new SessionStatusCallback();

public FacebookHelper(){
}

public FacebookHelper(Activity activity){

    this.activity = activity;
}

public FacebookHelper(Activity activity, Bundle savedInstanceState){

    this.activity = activity;
    Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

    Session session = Session.getActiveSession();
    if (session == null || session.getState().isClosed()) {
        if (savedInstanceState != null) {
            session = Session.restoreSession(activity, null,
                    statusCallback, savedInstanceState);
        }
        //if (session == null) {
            session = new Session(activity);
        //}
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
            session.openForRead(new Session.OpenRequest(activity)
                    .setCallback(statusCallback));
        }
    }
}

public Session.StatusCallback getStatusCallback() {
    return statusCallback;
}

public void loginToFacebook() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        session.openForRead(new Session.OpenRequest(activity)
                .setPermissions(Arrays.asList("email"/*,"user_birthday"*/,"user_location"))
                .setCallback(statusCallback));
    } else {
        Session.openActiveSession(activity, true, statusCallback);
    }
}

public void logoutFromFacebook() {

    Session session = Session.getActiveSession();
    if (session != null) {
        session.closeAndClearTokenInformation();
    }
}

public boolean isLoggedInFromFb() {
    Session session = Session.getActiveSession();
    if (session != null && session.isOpened()) {
        return true;
    } else {
        return false;
    }
}

public void appRequest(final Activity activity, final String id){

    Session.openActiveSession(activity, true, new StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {

            if (session.isOpened()) {

                Bundle params = new Bundle();
                params.putString("to", id);
                params.putString("message", "EGrocery Invite");

                WebDialog requestsDialog = (
                        new WebDialog.RequestsDialogBuilder(activity,
                                Session.getActiveSession(),
                                params))
                                .setOnCompleteListener(new OnCompleteListener() {

                                    @Override
                                    public void onComplete(Bundle values,
                                            FacebookException error) {
                                        // TODO Auto-generated method stub
                                        if (error != null) {
                                            if (error instanceof FacebookOperationCanceledException) {
                                                 //Toast.makeText(activity, R.string.txt_invitation_cancel,
                                                 //      Toast.LENGTH_SHORT).show();
                                            } else {
                                                // Toast.makeText(activity, R.string.txt_invitation_cancel,
                                                // Toast.LENGTH_SHORT).show();
                                            }
                                        } else {
                                            final String requestId = values.getString("request");
                                            if (requestId != null) {
                                                Toast.makeText(activity, "Invited Successfully",
                                                        Toast.LENGTH_SHORT).show();
                                            } else {
                                                // Toast.makeText(activity, R.string.txt_invitation_cancel,
                                                // Toast.LENGTH_SHORT).show();
                                            }
                                        }
                                    }

                                })
                                .build();
                requestsDialog.show();

                // BELOW 3 LINES ADDED BY SHAHZEB KHOWAJA.
                /*if(!requestsDialog.isShowing()) {
                    requestsDialog.show();
                }*/
            }   
        }

    });
}

public void postOnWall(final Activity activity, final String name, final String caption, final String description, 
        final String link, final String picture) {

    Session.openActiveSession(activity, true, new StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            // TODO Auto-generated method stub

            if (session.isOpened()) {

                Bundle params = new Bundle();
                params.putString("name", name);
                params.putString("caption", caption); //"DrawWithFriends"
                params.putString("description", description); //pa.getUserProfile().getFullName() +  " has shared the word " + challengeQuestions.get(current_num_question).getQuestion().getWord() + " with you in prepsta"
                params.putString("link", link);
                params.putString("picture", picture);

                WebDialog feedDialog = (
                    new WebDialog.FeedDialogBuilder(activity,
                        Session.getActiveSession(),
                        params))
                    .setOnCompleteListener(new OnCompleteListener() {

                        @Override
                        public void onComplete(Bundle values,
                            FacebookException error) {
                            if (error == null) {
                                // When the story is posted, echo the success
                                // and the post Id.
                                final String postId = values.getString("post_id");
                                if (postId != null) {
                                    /*Toast.makeText(ChallengeModeActivity.this,
                                        "Posted story, id: "+postId,
                                        Toast.LENGTH_SHORT).show();*/

                                    Toast.makeText(activity, "Posted successfully",
                                            Toast.LENGTH_SHORT).show();
                                } else {
                                    // User clicked the Cancel button
                                    //Toast.makeText(activity, R.string.txt_post_cancel, 
                                    //   Toast.LENGTH_SHORT).show();
                                }
                            } else if (error instanceof FacebookOperationCanceledException) {
                                // User clicked the "x" button
                                //Toast.makeText(activity, R.string.txt_post_cancel, 
                                //    Toast.LENGTH_SHORT).show();
                            } else {
                                // Generic, ex: network error
                                //Toast.makeText(activity, R.string.txt_post_cancel, 
                                //    Toast.LENGTH_SHORT).show();
                            }
                        }

                    })
                    .build();
                feedDialog.show();

            }
        }
    });

}

public void getFacebookFriends(final Activity activity) {

    Session.openActiveSession(activity, true, new StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {

            if (session.isOpened()) {
                Utils.Log(Constants.LOG_I, TAG, "Facebook Session Opened");

                Request friendRequest = Request.newMyFriendsRequest(session, new Request.GraphUserListCallback() {

                    @SuppressWarnings("unchecked")
                    @Override
                    public void onCompleted(List<GraphUser> users, Response response) {
                        // TODO Auto-generated method stub
                        if (response.getError() != null) {
                            Utils.Log(Constants.LOG_I,
                                    TAG, String.format("Error making request: %s", response.getError()));
                        } else {

                            Utils.Log(Constants.LOG_D, Constants.TAG, "fb friends: " + response.toString());
                            ((IFbCallback<List<GraphUser>, Response>)activity).onFbRequestComplete(users, response);
                        }
                    }
                });

                /*Bundle params = new Bundle();
                params.putString("fields", "id,name,picture");
                friendRequest.setParameters(params);*/
                friendRequest.executeAsync();
            }

        }

    });
}

private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {

        if(session.isOpened()){
            Utils.Log(Constants.LOG_I, TAG, "Facebook Session Opened");

           Request.newMeRequest(session, new Request.GraphUserCallback() {

                @SuppressWarnings("unchecked")
                @Override
                public void onCompleted(GraphUser user, Response response) {
                    // TODO Auto-generated method stub

                    if (response.getError() != null) {
                        Utils.Log(Constants.LOG_I,
                                TAG, String.format("Error making request: %s", response.getError()));
                    } else {

                        ((IFbCallback<GraphUser, Response>)activity).onFbRequestComplete(user, response);
                    }
                }
            }).executeAsync();
        }
    }
}

}

MainActivity.java

public class LoginActivity extends Activity implements OnClickListener, IFbCallback<GraphUser, Response>{


private FacebookHelper fbHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    fbHelper = new FacebookHelper(this, savedInstanceState);

    initControls();
}

@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Session.getActiveSession().addCallback(fbHelper.getStatusCallback());
    //googleHelper.getGoogleApiClient().connect();
}

@Override
protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
    Session.getActiveSession().removeCallback(fbHelper.getStatusCallback());
}

private void initControls() {

    Button fbSignInBtn = (Button) findViewById(R.id.login_fb_sign_in_btn);

    //listener
    fbSignInBtn.setOnClickListener(this);
}

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

@Override
public void onClick(View v) {

    switch (v.getId()) {

        case R.id.login_fb_sign_in_btn:

            fbHelper.loginToFacebook();
            break;
    }
}

@Override
public void onFbRequestComplete(GraphUser graphUser, Response response) {

    Utils.Log(Constants.LOG_E, Constants.TAG, response.toString());

    // store values locally
    String uid = graphUser.getId();
    String first_name = graphUser.getFirstName();
    String last_name = graphUser.getLastName();
    String email = "";

    if (response.toString().contains("email")) {
        email = graphUser.getProperty("email").toString();
    }

    Log.e("MainActivity", "id: " + uid);
    Log.e("MainActivity", "first name: " + first_name);
    Log.e("MainActivity", "last name: " + last_name);
    Log.e("MainActivity", "email: " + email);
}

}

Create and Implement interface

public interface IFbCallback<G, R> {

public void onFbRequestComplete(G graphUser, R response);
}

Add build.gradle file

apply plugin: 'com.android.application'

android {
compileSdkVersion 22
buildToolsVersion "23.0.0 rc3"

defaultConfig {
    applicationId "com.dvmfashion"
    minSdkVersion 15
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.facebook.android:facebook-android-sdk:3.19.0'

}

I can see you are generating wrong hash key for Facebook. You must use your package name which is "com.al.name" instead of Facebook "com.facebook.samples.loginhowto".

try {
    PackageInfo info = getPackageManager().getPackageInfo(
            "com.al.name", 
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
} catch (NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}

It is working.

LoginActivity:

 public static CallbackManager callbackmanager;

    Button fb_login;

    private boolean fb_signincllicked = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        setContentView(R.layout.activity_login);

//write this method in facebook button onclick:

 }

     public void onFblogin(boolean fb_btn) {

            fb_signincllicked = fb_btn;

            callbackmanager = CallbackManager.Factory.create();

            // Set permissions
            LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));

            LoginManager.getInstance().registerCallback(callbackmanager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {

                    final Set<String> deniedPermissions = loginResult.getRecentlyDeniedPermissions();

                    GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
                        @Override
                        public void onCompleted(JSONObject json, GraphResponse response) {

                            if (response.getError() != null) {
                                // handle error
                            } else {
                                try {

                                    if (deniedPermissions.contains("email")) {
                                        LoginManager.getInstance().logInWithReadPermissions(Login_Activity.this, Arrays.asList("email"));
                                    }

                                    JSONObject jsonObject = new JSONObject();

                                    jsonObject.put("full_name", json.getString("name"));
                                    Toast.makeText(getApplicationContext(),json.get("id").toString() +json.getString("name"), Toast.LENGTH_LONG).show();
                                    jsonObject.put("device_id", Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID));
                                    jsonObject.put("fb_id", json.getString("id"));
                                    jsonObject.put("signuptype", "1");


                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }).executeAsync();
                }

                @Override
                public void onCancel() {
                    Log.d("Cancel", "On cancel");
                }

                @Override
                public void onError(FacebookException error) {
                    Log.d("Error", error.toString());
                }
            });
        }




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

            if (fb_signincllicked) {
                callbackmanager.onActivityResult(requestCode, resultCode, data);
            }


        }

Add Dependence:

dependencies {
    compile 'com.facebook.android:facebook-android-sdk:4.5.0'
}

strings.xml:

add your fb id in your strings file. Don't add directly in your manifest file. It gives you error.

<string name="fb_appid">xxxxxxxx</string>

Manifest_fie:

<meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/fb_appid" />
 <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
                android:label="@string/app_name"
                android:theme="@android:style/Theme.Translucent.NoTitleBar" />

To Get Hash-Key:

 try {
            PackageInfo info = getPackageManager().getPackageInfo(
                    "your package name",
                    PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (PackageManager.NameNotFoundException e) {

        } catch (NoSuchAlgorithmException e) {

        }

add your package name above.

run this code in debug mode then you will get developement key hash in log and run this code in release mode you will get release hashkey.Add both these keys, package name and class name in developer site.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM