今天刚做好了FaceBook登录,觉得代码很简单,但是坑却很多。
1.实现自定义登录
一.导入facebook Sdk
(1).登录注册facebook(需翻墙);
(2).创建应用,这一步步都很简单,主要是这个地方要配置密钥散列,于是我按照facebook文档生成配置,不过最后不对,什么鬼。
![](https://img.haomeiwen.com/i7904998/bfdb2ba7c2376fb6.png)
会出现这样的报错,这是一个坑,我研究了一下午,其实很简单直接把这个上面显示的(红线部分)直接配上就ok。但是有的小伙伴发现配上还是不行。不要急,我敢百分百肯定是里面的字母搞错了比如小写l(L)和大写I(i)是不是一样,这样直接按照这打弄错很正常。网上很多什么openssl版本不对,安装openssl什么的,全是垃圾方法,写的人都是脑子有坑,还方法炒鸡复杂。我给大家最简单的方法解决。
![](https://img.haomeiwen.com/i7904998/2ca1c318dc1aafa4.png)
获取方法:
1.代码获取
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.example.packagename",
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) {
}
直接把这段代码放在mainActivity的oncreate();显示数据用TextView显示,在做个复制功能。搞定,解决。
2.查询base64
1>通过命令行获取apk的 SHA1
2>http://tomeko.net/online_tools/hex_to_base64.php?点开这个网站(需要翻墙)。生成的数据ok就是我们需要的,直接粘贴上去。
![](https://img.haomeiwen.com/i7904998/a41f6b88745af188.png)
注意:::::
如果你的包上传goole play 你上传后goole会改变你的签名,这个秘钥散列可以配置多个。
ok这个坑踩完完了,其他的就简单了.
下面介绍自定义按钮登录 开始集成代码
compile'com.facebook.android:facebook-login:[4,5)'
我是直接导入仓库
//登录工具类
public class FackBookLoginManager {
private static FackBookLoginManagerinstance;
private CallbackManagercallbackManager;
private ProfileTrackerprofileTracker;
private AccessTokenTrackeraccessTokenTracker;
public void setLoginMonitor(LoginMonitor loginMonitor) {
this.loginMonitor = loginMonitor;
}
private LoginMonitorloginMonitor;
public static FackBookLoginManagergetInstance() {
if (instance ==null) {
instance =new FackBookLoginManager();
}
return instance;
}
public FackBookLoginManager(){
callbackManager = CallbackManager.Factory.create();
}
public void create(final Activity coreActivity){
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback() {
@Override
public void onSuccess(LoginResult loginResult) {//登录成功
// App code
MLog.e("FackBook","loginResult.getAccessToken():"+loginResult.getAccessToken()+"===>loginResult.getRecentlyDeniedPermissions():"+loginResult.getRecentlyDeniedPermissions());
MLog.e("FackBook","===>loginResult.getRecentlyGrantedPermissions():"+loginResult.getRecentlyGrantedPermissions());
getFaceBookToken();
}
@Override
public void onCancel() {//取消登录
// App code
coreActivity.showToast(coreActivity.getString(R.string.cancel_the_login));
MLog.e("FackBook","onCancel取消登录");
CookieSyncManager.createInstance(coreActivity);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
}
@Override
public void onError(FacebookException exception) {
// App code
if (exceptioninstanceof FacebookAuthorizationException) {
if (AccessToken.getCurrentAccessToken() !=null) {
LoginManager.getInstance().logOut();
}
}
MLog.e("FackBook","onError:"+exception.toString());
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(callbackManager!=null){
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
public void getFaceBookToken() {
AccessToken mAccessToken = AccessToken.getCurrentAccessToken();
Profile profile = Profile.getCurrentProfile();
if(mAccessToken!=null){
Log.e("FackBook", "token :" + mAccessToken.getToken() +"," +"user_id" + mAccessToken.getUserId());
}else{
MLog.e("FackBook","token=null");
}
if(profile ==null){
Log.e("FackBook","profile=null");
}
if (mAccessToken!=null) {
//String id = profile.getId();
String access_token = mAccessToken.getToken();
String id= mAccessToken.getUserId();
MLog.e("FackBook","id:"+id+"==>access_token"+access_token);
if(loginMonitor!=null){
loginMonitor.loginSuccess("",access_token,id);
}
}
if(profile !=null){
Log.e("FackBook","profile.getId():"+profile.getId());
}
}
public interface LoginMonitor{
void loginSuccess(String third_name,String access_token,String id);
}
public void logInWithReadPermissions(CoreActivity coreActivity){
LoginManager.getInstance().logOut();
LoginManager.getInstance().logInWithReadPermissions(coreActivity, Arrays.asList("public_profile", "user_friends"));
}
public void onDestroy() {
accessTokenTracker.stopTracking();
profileTracker.stopTracking();
}
}
(2)在string里配上facebook里生成的appid和fb_login_protocol_scheme;一定要配在string
<string name="facebook_app_id">xxxxxxxxxxx</string>
<string name="fb_login_protocol_scheme">fbxxxxxxxxxxx</string>
(3)
AndroidManifest.xml 里配上
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
android:name="com.facebook.CustomTabActivity"
android:exported="true">
(4). 工具类调用
@Override
protected void onCreate(Bundle savedInstanceState) {
//初始化
FackBookLoginManager.getInstance().create(this);
}
//登录按钮
ivLoginWithFacebook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FackBookLoginManager.getInstance().logInWithReadPermissions(Activity.this);
}
});
//登录成功回调
FackBookLoginManager.getInstance().setLoginMonitor(new FackBookLoginManager.LoginMonitor() {
@Override
public void loginSuccess(String third_name, String access_token, String id) {
}
});
ok写好了,希望对大家有帮助,能够缩短大家开发时间。原创,转载请标明出处。
网友评论