简体   繁体   English

在Android Studio中将Facebook与最新的Facebook Sdk集成

[英]facebook integration with latest Facebook Sdk in android studio

I am working on facebook integration in android. 我正在从事Android中的Facebook集成。 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. 但是我不知道为什么当我的手机中已经有Facebook应用程序时,为什么它不起作用。 It is opening login page of facebook when i don't have facebook app in my mobile. 当我的手机中没有Facebook应用时,它正在打开Facebook的登录页面。

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: 建立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. 我正在使用Facebook帮助程序类进行登录。

FacebookHelper.java 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 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 添加build.gradle文件

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. 我可以看到您为Facebook生成了错误的哈希键。 You must use your package name which is "com.al.name" instead of Facebook "com.facebook.samples.loginhowto". 您必须使用包名称“ com.al.name”而不是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: 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: strings.xml:

add your fb id in your strings file. 在您的字符串文件中添加您的fb id。 Don't add directly in your manifest file. 不要直接添加到清单文件中。 It gives you error. 它给你错误。

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

Manifest_fie: 清单_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. 在调试模式下运行此代码,然后您将在日志中获得开发密钥哈希,并在发布模式下运行此代码,您将获得发布哈希密钥。在开发人员站点中添加这两个密钥,包名称和类名称。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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