您的位置:首页 > 移动开发 > Android开发

Facebook android 第三方登录

2016-12-13 18:32 246 查看
Facebook android 第三方登录

android平台使用Facebook账号登录自己的app

 - 前期准备
 - 注册Facebook开发者账号,添加自己的应用,按照官方文档的指引完成需要的步骤
 - 按照官方的文档进行android客户端的配置
     地址:https://developers.facebook.com/docs/facebook-login/android
     . 在文档中先完成第一步,按照指引没有问题
    . 完成项目对Facebook的依赖
    打开刚刚在Facebook上注册的项目
        . 在build.gradle中添上对Facebook SDK
    dependencies{
    compile 'com.facebook.android:facebook-android-sdk:[4,5)'
        .  在/res/values/strings.xml
   
<string name="facebook_app_id">149416002205054</string>
下面这个是对没有安装Facebook客户端的登录(新的SDK可以允许不下载Facebook客户端)
<string name="fb_login_protocol_scheme">fb149416002205054</string>
. 在manifests.xml中进行配置添加对上面两个值的依赖
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tao.chongba">

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

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"/>
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />

<activity android:name=".chongba">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="@string/fb_login_protocol_scheme" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</manifest
. 使用官方的LoginButton做测试 //TODO 后期改为自定义Button 在res/layout/xxx.xml中添上
<com.faceb
4000
ook.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" />
. 最后开始activity的编写
activity类继承了FragmentActivity类
使用loginManager进行注册回调
override onCreate(),首先要先对Facebook的sdk进行初始化
FacebookSdk.sdkInitialize(getApplicationContext());
下面开始进行set view 和 注册回调
最后通过
onActivityResult
方法将回调结果传给callbackManager完成的代码如下
package com.example.tao.chongba;

import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;

public class chongba extends FragmentActivity {
CallbackManager callbackManager;

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

callbackManager = CallbackManager.Factory.create();

LoginManager.getInstance().registerCallback(callbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
System.out.println("SUCCESS");

System.out.println("AccessToken :"+loginResult.getAccessToken().getToken());

}

@Override
public void onCancel() {
// App code
System.out.println("CANCEL");
}

@Override
public void onError(FacebookException exception) {
// App code
System.out.println("ERROR");
}
});
//        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));
}

@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("data : "+data.toString());
callbackManager.onActivityResult(requestCode, resultCode, data);

}

}

最后在登录成功里面获取到AccessToken
得到AccessToken后可以使用Graph API 来获取用户的资料
这里是在server端进行获取userInfo的
创建需要的userInfo的信息实体类
public class FBUserInfoEntity {
    private String id;
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
利用HttpClient获取API返回的UserInfo

package com.pet.util.thirdparty;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.StatusLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class FBUserInfoUtil {
    public FBUserInfoEntity getFBUser(String accessToken) throws IOException{
        StringBuilder sb = new StringBuilder();
        sb.append("https://graph.facebook.com/v2.8/me?access_token=")
          .append(accessToken);
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet HG = new HttpGet(sb.toString());
        CloseableHttpResponse response = httpClient.execute(HG);
        try{
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if(statusCode == 200){
                 HttpEntity entity = response.getEntity();
                 return new ObjectMapper().readValue(EntityUtils.toString(entity), FBUserInfoEntity.class);
            }else{
                
                return new FBUserInfoEntity();
            }
        }finally{
            response.close();
        }
        
    }
}
这样就获取到Facebook用的信息最后进行数据处理,处理完之后由client端访问API进行数据访问

//TODO 后期补上Client端直接获取用户的资料并在view中显示

//因为第一次接触android,好多不是很懂,先记下来,后期对每个点进行学习
- 列表内容
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android facebook