Facebook Android SDK 4.14使用详解(2)

在 authorities 值的末尾添加您的应用编号。例如,如果 Facebook 应用编号是 1234(注:实际为15位左右的数字),则声明应如下图所示:

<providerandroid:authorities="com.facebook.app.FacebookContentProvider1234"android:name="com.facebook.FacebookContentProvider"android:exported="true"/>

好了,基本的环境现在已经配置好了,可以开始着手做登录功能了。

首先需要在xml布局中添加一个facebook按钮

注:这个facebook按钮不一定要放在xml里,我一般都自定义一个带有点击事件的控件,然后再点击事件中 new一个facebook按钮,然后调用它的callonClick()方法,实现出来和点击原生按钮一样,但是自定义按钮可以实现更多的点击事件和设置背景图片等。

/** * 初始化facebook的SDK自带按钮 * 这里会把点击事件拦住,不会向下层的facebook button传递,然后先执行自定义的点击事件,再执行facebook button的原生点击事件 * 可以在自定义点击事件里写一些记录追踪或者动画的代码 * @param clickView 用来代替原生facebook按钮的自定义View,用来拦截点击事件,可以传null * @param lbFacebook facebook原生登录按钮 * @param addtionalClickEvent 拦截facebook原生按钮点击事件,并附加一个点击事件,可以传null */ public void initFBLoginButton(View clickView, final LoginButton lbFacebook, Fragment fragment,FacebookCallback<LoginResult> facebookCallback,final Runnable addtionalClickEvent){ initFBLoginButton(lbFacebook,fragment,facebookCallback); if(clickView == null)return; clickView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { JLogUtils.i("AlexFB","点击了facebook上面的按钮"); signOut();//点击登录按钮先登出 if(addtionalClickEvent != null)addtionalClickEvent.run();//先执行自定义点击事件 lbFacebook.callOnClick();//再执行facebook登录按钮原生点击事件 } }); } /** * 初始化facebook登录按钮,需要自己写一个登录回调传进来 * @param lbFacebook * @param fragment 可以传null * @param facebookCallback */ public void initFBLoginButton(LoginButton lbFacebook, Fragment fragment, FacebookCallback<LoginResult> facebookCallback){ lbFacebook.setReadPermissions("public_profile", "email", "user_birthday", "user_status"); // 如果你把登陆按钮放在一个fragment里面,就用这个方法,用来使用fragment启动facebook的activity并调用fragment的onActivityResult if(fragment != null)lbFacebook.setFragment(fragment); // Other app specific specialization facebookCallbackManager = CallbackManager.Factory.create(); // z注册登录回调 lbFacebook.registerCallback(facebookCallbackManager,facebookCallback); }


布局文件可以这么设置

<RelativeLayout android:id="@+id/ll_facebook" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="41dp" android:layout_marginRight="41dp" android:layout_below="@id/llHeader" android:layout_marginTop="20dp" > <TextView android:id="@+id/tv_facebook" android:layout_width="match_parent" android:textColor="@color/white" android:background="@drawable/sign_up_facebook" android:textSize="50dp" android:layout_height="52dp" /> </RelativeLayout>


这里并没有像官网说的那样使用原生com.facebook.login.widget.LoginButton按钮,而是用了一个TextView代替,好处是TextView可以自由设定大小,背景图片,点击事件,而原生按钮不行。java中这样部署:

lbFacebook = new LoginButton(getContext()); facebookHelper.initFBLoginButton(tv_facebook, lbFacebook, this, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { JLogUtils.i("AlexFB","facebook登录成功"); if(loginResult == null) return; JLogUtils.i("AlexFB","token是"+loginResult.getAccessToken()); JViewUtils.showProgressBar(loginRegisterActivity); for(String s:loginResult.getRecentlyGrantedPermissions()){ JLogUtils.i("AlexFB","被授予的权限是::"+s); } getUserFacebookBasicInfo();//获取facebook登录用户的基本信息的方法 } @Override public void onCancel() { // App code JLogUtils.i("AlexFB","facebook登录被取消"); } @Override public void onError(FacebookException exception) { // App code JLogUtils.i("AlexFB","facebook登录出现异常",exception); } }, new Runnable() { @Override public void run() { JLogUtils.i("Alex","点击了tv"); //写一些其他的点击事件,比如动画,事件追踪等 } });


此时用户点击了我的TextView之后会获得和点击原生登录按钮一样的效果,如果用户手机上装了Facebook的客户端,那么就会开启客户端,然后马上返回此页面,用facebook APP上的登录用户进行登录;如果用户没有安装Facebook APP,那么就开启一个WebView 的Activity让用户通过网页登陆,并在登录完成后返回此页面。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/aaf8a4aa7de72bf2f0c66df92e0a5e4b.html