今天剛做好了FaceBook登錄,覺得代碼很簡單,但是坑卻很多。
1.實現自定義登錄
? ?一.導入facebook Sdk
? ?(1).登錄注冊facebook(需翻墻);
? ?(2).創建應用,這一步步都很簡單,主要是這個地方要配置密鑰散列,于是我按照facebook文檔生成配置,不過最后不對,什么鬼。
會出現這樣的報錯,這是一個坑,我研究了一下午,其實很簡單直接把這個上面顯示的(紅線部分)直接配上就ok。但是有的小伙伴發現配上還是不行。不要急,我敢百分百肯定是里面的字母搞錯了比如小寫l(L)和大寫I(i)是不是一樣,這樣直接按照這打弄錯很正常。網上很多什么openssl版本不對,安裝openssl什么的,全是垃圾方法,寫的人都是腦子有坑,還方法炒雞復雜。我給大家最簡單的方法解決。
獲取方法:
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就是我們需要的,直接粘貼上去。
注意:::::
如果你的包上傳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寫好了,希望對大家有幫助,能夠縮短大家開發時間。原創,轉載請標明出處。
? ? ? ?