如何使用facebook sdk 4.7在android中实现facebook登录

问题描述 投票:3回答:6

我正在尝试使用android sdk 4.7登录facebook。我试过以下链接http://www.theappguruz.com/blog/android-facebook-integration-tutorial http://www.androidhive.info/2012/03/android-facebook-connect-tutorial/

android android-facebook
6个回答
14
投票

此代码适用于我,尝试并检查您使用的是facebook sdk 4.7

package com.kushal.facebooklogin;

    import java.util.Arrays;
    import org.json.JSONException;
    import org.json.JSONObject;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;
    import com.facebook.*;
    import com.facebook.login.LoginManager;
    import com.facebook.login.LoginResult;
    import com.facebook.login.widget.LoginButton;

    public class FacebookLogin extends FragmentActivity
    {
        private TextView tvfirst_name, tvlast_namee, tvfull_name, tvEmail;
        private CallbackManager callbackManager;
        LoginButton login_button;
        String email,name,first_name,last_name;

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            FacebookSdk.sdkInitialize(this.getApplicationContext());
            callbackManager = CallbackManager.Factory.create();

            setContentView(R.layout.main);

            tvfirst_name        = (TextView) findViewById(R.id.first_name);
            tvlast_namee        = (TextView) findViewById(R.id.last_name);
            tvfull_name         = (TextView) findViewById(R.id.full_name);
            tvEmail             = (TextView) findViewById(R.id.email);
            login_button        = (LoginButton) findViewById(R.id.login_button);

            login_button.setReadPermissions(Arrays.asList("public_profile","email"));
            login_button.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
            {
                @Override
                public void onSuccess(LoginResult loginResult)
                {
                    login_button.setVisibility(View.GONE);

                    GraphRequest graphRequest   =   GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback()
                    {
                        @Override
                        public void onCompleted(JSONObject object, GraphResponse response)
                        {
                            Log.d("JSON", ""+response.getJSONObject().toString());

                            try
                            {
                                email       =   object.getString("email");
                                name        =   object.getString("name");
                                first_name  =   object.optString("first_name");
                                last_name   =   object.optString("last_name");

                                tvEmail.setText(email);
                                tvfirst_name.setText(first_name);
                                tvlast_namee.setText(last_name);
                                tvfull_name.setText(name);
                                LoginManager.getInstance().logOut();
                            }
                            catch (JSONException e)
                            {
                                e.printStackTrace();
                            }
                        }
                    });

                    Bundle parameters = new Bundle();
                    parameters.putString("fields", "id,name,first_name,last_name,email");
                    graphRequest.setParameters(parameters);
                    graphRequest.executeAsync();
                }

                @Override
                public void onCancel()
                {

                }

                @Override
                public void onError(FacebookException exception)
                {

                }
            });
        }

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

xml设计如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:facebook="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFF"
    android:gravity="center"
    android:orientation="vertical" >

    <com.facebook.login.widget.LoginButton
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/first_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/last_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/full_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:textSize="18sp" />
    </LinearLayout>

</LinearLayout>

清单文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kushal.facebooklogin"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar" >
        <activity
            android:name=".FacebookLogin"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustResize" >
            <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" />

        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/app_id" />
    </application>

</manifest>

1
投票

你可以使用Facebook Android SDK。在这里,您已经在documentation中解释了如何为您的应用构建Facebook登录。

它说:

将Facebook登录添加到您的应用程序的最简单方法是从SDK添加LoginButton。这是Button的自定义视图实现。您可以在应用中使用此按钮来实施Facebook登录。 enter image description here

添加登录按钮

使用完整的类名com.facebook.widget.LoginButton将按钮添加到布局XML文件中:

<com.facebook.login.widget.LoginButton
    android:id="@+id/login_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="30dp"
    android:layout_marginBottom="30dp" />

然后在UI中设置按钮,将其添加到片段中并更新您的活动以使用您的片段。

您可以自定义“登录”按钮的属性,并在onCreateView()方法中注册回调。

您可以自定义的属性包括LoginBehaviorDefaultAudienceToolTipPopup.Style和LoginButton的权限。例如:

@Override
public View onCreateView(
        LayoutInflater inflater,
        ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.splash, container, false);

    loginButton = (LoginButton) view.findViewById(R.id.login_button);
    loginButton.setReadPermissions("user_friends");
    // If using in a fragment
    loginButton.setFragment(this);    
    // Other app specific specialization

    // Callback registration
    loginButton.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
        }
    });    
}

如果在片段中使用LoginButton,则需要通过调用setFragment在按钮上设置片段。

然后,您需要调用FacebookSdk.initialize来初始化SDK,然后调用CallbackManager.Factory.create创建一个回调管理器来处理登录响应。以下是在片段中添加回调的示例:

public class MainActivity extends FragmentActivity {
    CallbackManager callbackManager;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        LoginButton loginButton = (LoginButton) view.findViewById(R.id.usersettings_fragment_login_button);
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { ... });
    }

最后你应该调用callbackManager.onActivityResult通过LoginManager将登录结果传递给callbackManager

注册回拨

要响应登录结果,您需要使用LoginManagerLoginButton注册回调。如果您使用LoginButton注册回调,则无需在登录管理器上注册回调。

您将回调添加到您的活动或片段的onCreate()方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    FacebookSdk.sdkInitialize(this.getApplicationContext());

    callbackManager = CallbackManager.Factory.create();

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

如果登录成功,则LoginResult参数具有新的AccessToken,以及最近授予或拒绝的权限。

登录成功时不需要registerCallback,您可以选择使用下面描述的AccessTokenTracker类跟踪当前访问令牌更改。

然后在onActivityResult()中将登录结果转发给在callbackManager中创建的onCreate()

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

您与FacebookSDK登录或共享集成的每个活动和片段都应该将onActivityResult转发到callbackManager

要了解有关获取其他权限的更多信息,请

Managing Permissions, AndroidPermissions with Facebook Login


1
投票

我使用facebook sdk 4.10.0在我的Android应用程序中集成登录。我遵循的教程是:

Facebook login integration android studio.

您将能够从facebbok获取名字,姓氏,电子邮件,性别,脸书ID和出生日期。

上面的教程还解释了如何通过视频在Facebook开发者控制台中创建应用程序

grad了.build

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

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

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.facebook.android:facebook-android-sdk:4.10.0'
    compile 'com.github.androidquery:androidquery:0.26.9'
}

activity_main.xml的源代码

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.demonuts.fblogin.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#000"
        android:layout_marginLeft="10dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/text"/>

    <ImageView
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:id="@+id/ivpic"
        android:src="@mipmap/ic_launcher"/>

    <com.facebook.login.widget.LoginButton
        android:id="@+id/btnfb"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />   </LinearLayout>

MainActivity.java的代码

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import com.androidquery.AQuery;
import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
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.Profile;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {



      private AQuery aQuery;
        private ImageView ivpic;
        private TextView tvdetails;
        private CallbackManager callbackManager;
        private AccessTokenTracker accessTokenTracker;
        private ProfileTracker profileTracker;
        private LoginButton loginButton;
        private FacebookCallback&lt;LoginResult&gt; callback = new FacebookCallback&lt;LoginResult&gt;() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                Log.v("LoginActivity", response.toString());

                                // Application code
                                try {
                                    Log.d("tttttt",object.getString("id"));
                                    String birthday="";
                                    if(object.has("birthday")){
                                        birthday = object.getString("birthday"); // 01/31/1980 format
                                    }

                                    String fnm = object.getString("first_name");
                                    String lnm = object.getString("last_name");
                                    String mail = object.getString("email");
                                    String gender = object.getString("gender");
                                    String fid = object.getString("id");
                                    tvdetails.setText("Name: "+fnm+" "+lnm+" \n"+"Email: "+mail+" \n"+"Gender: "+gender+" \n"+"ID: "+fid+" \n"+"Birth Date: "+birthday);
                                    aQuery.id(ivpic).image("https://graph.facebook.com/" + fid + "/picture?type=large");
                                    //https://graph.facebook.com/143990709444026/picture?type=large
                                    Log.d("aswwww","https://graph.facebook.com/"+fid+"/picture?type=large");

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

                            }
                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id, first_name, last_name, email, gender, birthday, location");
                request.setParameters(parameters);
                request.executeAsync();

            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException error) {

            }
        };


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            FacebookSdk.sdkInitialize(this);
            setContentView(R.layout.activity_main);

            tvdetails = (TextView) findViewById(R.id.text);
            ivpic = (ImageView) findViewById(R.id.ivpic);

            loginButton = (LoginButton) findViewById(R.id.btnfb);
            aQuery = new AQuery(this);

            callbackManager = CallbackManager.Factory.create();

            accessTokenTracker= new AccessTokenTracker() {
                @Override
                protected void onCurrentAccessTokenChanged(AccessToken oldToken, AccessToken newToken) {

                }
            };

            profileTracker = new ProfileTracker() {
                @Override
                protected void onCurrentProfileChanged(Profile oldProfile, Profile newProfile) {

                }
            };

            accessTokenTracker.startTracking();
            profileTracker.startTracking();
            loginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_birthday", "user_friends"));
            loginButton.registerCallback(callbackManager, callback);

        }

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

        }

        @Override
        public void onStop() {
            super.onStop();
            accessTokenTracker.stopTracking();
            profileTracker.stopTracking();
        }

        @Override
        public void onResume() {
            super.onResume();
            Profile profile = Profile.getCurrentProfile();

        }

    }

0
投票
  1. 首先转到https://developers.facebook.com/,登录并选择我的应用程序并创建一个应用程序。
  2. 正确遵循给定的指令。
  3. 提供packagename和packagename.ActivityName,选择使用App name然后保存它。
  4. 生成哈希密钥(下载OpenSSL)和(Java JDK)。 - 对于窗户!
  5. 将OpenSSL内容解压缩到C:\ OpenSSL
  6. 转到CMD提示符将当前路径设置为JDK的bin文件夹。
  7. 然后使用此命令:

keytool -exportcert -alias androiddebugkey -keystore“C:\ Users \ Shredder \ .android \ debug.keystore”| “C:\ OpenSSL \ bin \ openssl”sha1 -binary | “C:\ OpenSSL \ bin \ openssl”base64

确保你使用像UserAccountName等正确的路径.Mine是碎纸机。之后使用密码:123456。

  1. 将hashKey粘贴到必填字段。然后跟着......
  2. 如果需要,请使用以下代码。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign__in); String fb_id =""; String fb_fName =""; String fb_lName =""; String fb_email =""; String EMAIL = "email"; CallbackManager callbackManager = CallbackManager.Factory.create(); final LoginButton loginButton = (LoginButton) findViewById(R.id.login_button); loginButton.setReadPermissions(Arrays.asList(EMAIL)); loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { String userId = loginResult.getAccessToken().getUserId(); GraphRequest graphRequest = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { getUserFbUserInfo (object); } }); Bundle parameters = new Bundle(); parameters.putString("fields", "first_name,last_name,email,id"); graphRequest.setParameters(parameters); graphRequest.executeAsync(); Intent it = new Intent(getApplicationContext(), Home_Page.class); it.putExtra("fbLogin", true); startActivity(it); } @Override public void onCancel() { // App code } @Override public void onError(FacebookException exception) { // App code } }); } private void getUserFbUserInfo(JSONObject object) { try { fb_email = object.getString("email"); fb_fName = object.getString("first_name"); fb_lName = object.getString("last_name"); fb_id = object.getString("id"); } catch (JSONException e) { e.printStackTrace(); } } @Override protected void onActivityResult ( int requestCode, int resultCode, Intent data){ callbackManager.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data); } }

-1
投票

检查这个简单的Facebook登录库:

https://github.com/sromku/android-simple-facebook

这是我上传的演示链接到简单的Facebook登录与自定义按钮:http://www.demoadda.com/demo/android/login-with-facebook_108

它是在android应用程序中实现facebook登录的最简单方法。

您可以添加如下按钮:

<TextView
            android:id="@+id/btnFb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:gravity="center"
            android:text="Login with Facebook"
            android:textColor="@color/white" />

在gradle文件中,您可以添加:

compile 'com.sromku:simple-fb:4.1.1'

请检查。


-2
投票
FACEBOOK LOGIN STEPBYSTEP 

   FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();
        printHashKey();

meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/app_id" />

        <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" />



btnFacebook.setReadPermissions("public_profile","email");


 btnFacebook.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            String facebook_email;
            String name;
            String profilePicUrl;
            private ProfileTracker mProfileTracker;

            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.e("facabook","Step1");
                GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(JSONObject object, GraphResponse response) {
                                Log.e("LoginActivity", response.toString());

                                // Application code
                                try {
                                    facebook_email = object.getString("email");
                                    name=object.getString("name");
                                    if (object.has("picture")) {
                                        profilePicUrl = object.getJSONObject("picture").getJSONObject("data").getString("url");
                                        // set profile image to imageview using Picasso or Native methods
                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                                if(Profile.getCurrentProfile() == null) {
                                    mProfileTracker = new ProfileTracker() {
                                        @Override
                                        protected void onCurrentProfileChanged(Profile profile, Profile profile2) {
                                            // profile2 is the new profile
                                            Log.e("facebook - profile", profile2.getFirstName());

                                            facebookLogin(facebook_email,name,profilePicUrl,Constant.DUMMY_PASSWORD);
                                            mProfileTracker.stopTracking();
                                        }
                                    };
                                    mProfileTracker.startTracking();
                                } else {
                                    facebookLogin(facebook_email,name,profilePicUrl,Constant.DUMMY_PASSWORD);
                                }
                            }
                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id,name,email,picture.type(large)");
                request.setParameters(parameters);
                request.executeAsync();
            }

            @Override
            public void onCancel() {
                Log.e("facebook - onCancel", "cancelled");
            }

            @Override
            public void onError(FacebookException e) {
                Log.e("facebook - onError", e.getMessage());
                Toast.makeText(SignInActivity.this,e.getMessage(),Toast.LENGTH_LONG).show();
            }
        });

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

        Log.e("Request Code", requestCode + "===========");
        if(requestCode==64206)
        {
            callbackManager.onActivityResult(requestCode, resultCode, data);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.