android - facebook 在 android studio 中与最新的 Facebook Sdk 集成

标签 android facebook android-studio

我正在研究 Android 中的 Facebook 集成。我用谷歌搜索并正在研究它。但是我不知道为什么当我的手机中已经有 facebook 应用程序时它不起作用。 当我的手机中没有 facebook 应用程序时,它正在打开 facebook 的登录页面。

我的代码:

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

list 文件:

<?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>

构建渐变:

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

哈希 key 生成代码:

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) {

    }

最佳答案

我正在使用 Facebook 帮助类进行登录。

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

主 Activity .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);
}

创建和实现接口(interface)

public interface IFbCallback<G, R> {

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

添加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'

关于android - facebook 在 android studio 中与最新的 Facebook Sdk 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32452859/

相关文章:

java - 在 Android 应用程序中使用 Gmail/Facebook 凭据注册

android - 如何禁用Android Studio代码风格警告 "... can be simplified to ..."

android - Android ssh 应用程序需要建议

android - 如何从房间 dao 访问中获取光标对象列表?

ios - Facebook App 中的 Graph API 与 iOS SDK

iphone - Facebook JS 连接不支持的浏览器

java - 实现 AdMob 后出现问题

android - Fabric 插件 Android Eclipse 的登录无效

android-studio - 缺少 Android Studio 调试监 window 格

android - 如何将特定的 github PR 编译到我的 Android Studio 项目中 - 等级错误 : Failed to resolve