facebook登錄和分享

          整體來說,Facebook在國際化中做的是非常好的。也是,Twitter和YouTube都是Google自己家的,在中國政府受挫之後,就不方便投入太多,怎麼做都好像一個血脈,一個味道。

          然後Facebook就不一樣,小札的丈母孃祖上就是中國的,而且小札年輕,特別喜歡和挑戰新的事務。。據說,Facebook爲了在非洲的使用體驗,專門派工程師到非常調研,非常到位的。

 

Facebook 的開發者支持分成兩塊:

        賬戶登錄 Account login,和 Account Kit 。

提供的這兩個服務,都提供了各種平臺的支持,ios,andorid,web,mobilePhone等等。

 

Account Kit 提供電話號碼和郵箱登錄功能,無需玩家記憶任何其他密碼。

“Facebook 登錄”讓玩家能夠使用他們現有的 Facebook 帳戶兩步輕鬆完成帳戶註冊。

兩者結合使用,效果更好 — 可用於壯大您的客戶羣。

2018 年 8 月之前,Account Kit 不會收取任何短信費用,之後會按照標準的短信費率,對每月確認短信數量超出 10 萬的應用收費。

 

應該說,這兩個功能屬於異曲同工的作用,具體的使用可以參考產品和業務的需要進行選型,。。在開發的時候,可以同時繼承和包裝,需要的時候,直接使用。

 

AndroidSDK文檔:https://developers.facebook.com/docs/accountkit/android

客戶端SDK_android下載:https://developers.facebook.com/docs/android

一,用戶登錄

好了,下面開始進行具體的步驟了::

    1,跟所有的三方賬戶一樣,註冊開發者賬戶,創建應用,獲得應用編號口令什麼的。

    2,gradle配置

repositories {
  jcenter()
}

dependencies {
  compile 'com.facebook.android:account-kit-sdk:4.+'
}
{
  jcenter()
}

dependencies {
  compile 'com.facebook.android:account-kit-sdk:4.+'
}

    3,配置manifest

<meta-data android:name="com.facebook.accountkit.ApplicationName"
           android:value="@string/app_name" />
<meta-data android:name="com.facebook.sdk.ApplicationId"
           android:value="@string/FACEBOOK_APP_ID" />
<meta-data android:name="com.facebook.accountkit.ClientToken"
           android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" />

<activity
  android:name="com.facebook.accountkit.ui.AccountKitActivity" />
 android:name="com.facebook.accountkit.ApplicationName"
           android:value="@string/app_name" />
<meta-data android:name="com.facebook.sdk.ApplicationId"
           android:value="@string/FACEBOOK_APP_ID" />
<meta-data android:name="com.facebook.accountkit.ClientToken"
           android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" />

<activity
  android:name="com.facebook.accountkit.ui.AccountKitActivity" />

    根據應用的情況,可能需要更多的配置,允許AccountKitActivity的啓動,

<activity
  android:name="com.facebook.accountkit.ui.AccountKitActivity"
  android:theme="@style/AppLoginTheme"
  tools:replace="android:theme" />

  android:name="com.facebook.accountkit.ui.AccountKitActivity"
  android:theme="@style/AppLoginTheme"
  tools:replace="android:theme" />

    4*,如果想禁用應用內事件,可以加入。。這裏默認的value是true。。這裏的應用內事件表示 AccountKit 登錄展示 ,AccountKit登錄開始,AccountKit登錄嘗試,AccountKit的登錄。這裏的統計可以在控制面板的漏斗裏面看到。

<meta-data android:name="com.facebook.accountkit.FacebookAppEventsEnabled"
           android:value="false"/>
 android:name="com.facebook.accountkit.FacebookAppEventsEnabled"
           android:value="false"/>

    5,檢查當前會話,意思就是登錄之後的回調類似於。當在開發者的控制面板裏啓用客戶端的訪問口令流程,登錄狀態就會傳給客戶端程序。
 

import com.facebook.accountkit.AccountKit;
import com.facebook.accountkit.AccessToken;

AccessToken accessToken = AccountKit.getCurrentAccessToken();

if (accessToken != null) {
  //Handle Returning User
} else {
  //Handle new or logged out user
}
 com.facebook.accountkit.AccountKit;
import com.facebook.accountkit.AccessToken;

AccessToken accessToken = AccountKit.getCurrentAccessToken();

if (accessToken != null) {
  //Handle Returning User
} else {
  //Handle new or logged out user
}

    6,短信登錄流程。
 

import com.facebook.accountkit.AccountKit;

public static int APP_REQUEST_CODE = 99;

public void phoneLogin(final View view) {
  final Intent intent = new Intent(getActivity(), AccountKitActivity.class);
  AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder =
    new AccountKitConfiguration.AccountKitConfigurationBuilder(
      LoginType.PHONE,
      AccountKitActivity.ResponseType.CODE); // or .ResponseType.TOKEN
  // ... perform additional configuration ...
  intent.putExtra(
    AccountKitActivity.ACCOUNT_KIT_ACTIVITY_CONFIGURATION,
    configurationBuilder.build());
  startActivityForResult(intent, APP_REQUEST_CODE);
}
 com.facebook.accountkit.AccountKit;

public static int APP_REQUEST_CODE = 99;

public void phoneLogin(final View view) {
  final Intent intent = new Intent(getActivity(), AccountKitActivity.class);
  AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder =
    new AccountKitConfiguration.AccountKitConfigurationBuilder(
      LoginType.PHONE,
      AccountKitActivity.ResponseType.CODE); // or .ResponseType.TOKEN
  // ... perform additional configuration ...
  intent.putExtra(
    AccountKitActivity.ACCOUNT_KIT_ACTIVITY_CONFIGURATION,
    configurationBuilder.build());
  startActivityForResult(intent, APP_REQUEST_CODE);
}

        APP_REQUEST_CODE 是您用於追蹤登錄流程的自定義代碼。它可以是任何整數,但需要由您的應用程序設置。
        初始化 intent(意圖)附加程序時,請務必指定與 Facebook 開發者門戶網站面板中的應用授權設置相匹配的 AccountKitActivity.ResponseType:如果您的應用面板的啓用客戶端訪問口令流程開關設置爲“開”,則指定爲TOKEN,如果設置爲“關”,則指定爲 CODE。

     7,郵箱登錄流程

import com.facebook.accountkit.AccountKit;

public static int APP_REQUEST_CODE = 99;

public void emailLogin(final View view) {
  final Intent intent = new Intent(getActivity(), AccountKitActivity.class);
  AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder =
    new AccountKitConfiguration.AccountKitConfigurationBuilder(
      LoginType.EMAIL,
      AccountKitActivity.ResponseType.CODE); // or .ResponseType.TOKEN
  // ... perform additional configuration ...
  intent.putExtra(
    AccountKitActivity.ACCOUNT_KIT_ACTIVITY_CONFIGURATION,
    configurationBuilder.build());
  startActivityForResult(intent, APP_REQUEST_CODE);
}
 com.facebook.accountkit.AccountKit;

public static int APP_REQUEST_CODE = 99;

public void emailLogin(final View view) {
  final Intent intent = new Intent(getActivity(), AccountKitActivity.class);
  AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder =
    new AccountKitConfiguration.AccountKitConfigurationBuilder(
      LoginType.EMAIL,
      AccountKitActivity.ResponseType.CODE); // or .ResponseType.TOKEN
  // ... perform additional configuration ...
  intent.putExtra(
    AccountKitActivity.ACCOUNT_KIT_ACTIVITY_CONFIGURATION,
    configurationBuilder.build());
  startActivityForResult(intent, APP_REQUEST_CODE);
}

點擊郵件的地址回到應用,需要一箇中間者進行重定向。

<activity android:name="com.facebook.accountkit.ui.AccountKitEmailRedirectActivity">
   <intent-filter>
     <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/ak_login_protocol_scheme" />
  </intent-filter>
</activity>
 android:name="com.facebook.accountkit.ui.AccountKitEmailRedirectActivity">
   <intent-filter>
     <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/ak_login_protocol_scheme" />
  </intent-filter>
</activity>


// if your Facebook App ID is 1234567, you should use ak1234567
<string name="ak_login_protocol_scheme">akFACEBOOK_APP_ID</string>

<string name="ak_login_protocol_scheme">akFACEBOOK_APP_ID</string>


API的其他功能:
       AccountKitConfigurationBuilder 對象通過提供允許您在運行時改寫默認屬性的方法。
       setInitialAuthState(String initialAuthState)           (可選)由開發者生成的一個隨機數,用於確認收到的響應與請求匹配。
        setInitialEmail(String initialEmail)        (可選)在郵箱登錄流程中預填充用戶的電子郵箱。
        setDefaultCountryCode(String defaultCountryCode)          (可選)設置短信登錄流程中默認顯示的國家/地區代碼。
        setInitialPhoneNumber(PhoneNumber initialPhoneNumber)             (可選)在短信登錄流程中預填充用戶的手機號碼。
        setFacebookNotificationsEnabled(boolean facebookNotificationsEnabled)       (可選)如果設置此標記,Account Kit 就會向用戶提供在短信發送失敗後,通過 Facebook 通知接收驗證消息的選項,前提是他們的手機號碼與 Facebook 帳戶關聯。關聯的手機號碼必須是 Facebook 帳戶的主要手機號碼。
默認:true
         setReadPhoneStateEnabled(boolean readPhoneStateEnabled);
         setReceiveSMS(boolean receiveSMSEnabled);
         setSMSWhitelist(String[] smsWhitelist);
         setSMSBlacklist(String[] smsBlacklist);

 

 

下面一大塊,是自定製Android UI部分的:

開發者SDK:https://developers.facebook.com/docs/accountkit/android/customizing

    基本UI:

           經典:

          半透明:

          現代:

    高級UI:

爲應用添加皮膚:

// constructor without a background image
AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder;
UIManager uiManager;

// Skin is CLASSIC, CONTEMPORARY, or TRANSLUCENT
uiManager = new SkinManager(
            Skin <skin>,
            @ColorInt int <primaryColor>);
configurationBuilder.setUIManager(uiManager);
AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder;
UIManager uiManager;

// Skin is CLASSIC, CONTEMPORARY, or TRANSLUCENT
uiManager = new SkinManager(
            Skin <skin>,
            @ColorInt int <primaryColor>);
configurationBuilder.setUIManager(uiManager);
// constructor with a background image imageAccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder;
UIManager uiManager;
// Skin is CLASSIC, CONTEMPORARY, or TRANSLUCENT
// Tint is WHITE or BLACK
// TintIntensity is a value between 55-85%
uiManager = new SkinManager(
            Skin <skin>,
            @ColorInt int <primaryColor>,
            @DrawableRes int <backgroundImage>,
            Tint <tint>,
            double <tintIntensity>);
configurationBuilder.setUIManager(uiManager);
UIManager uiManager;
// Skin is CLASSIC, CONTEMPORARY, or TRANSLUCENT
// Tint is WHITE or BLACK
// TintIntensity is a value between 55-85%
uiManager = new SkinManager(
            Skin <skin>,
            @ColorInt int <primaryColor>,
            @DrawableRes int <backgroundImage>,
            Tint <tint>,
            double <tintIntensity>);
configurationBuilder.setUIManager(uiManager);

高級UI部分:

public class MyAdvancedUIManager extends BaseUIManager {

    private final ButtonType confirmButton;
    private final ButtonType entryButton;
    private final TextPosition textPosition;

    public MyAdvancedUIManager(
            final ButtonType confirmButton,
            final ButtonType entryButton,
            final LoginType loginType,
            final TextPosition textPosition,
            final int themeResourceId) {
        super(loginType, themeResourceId);
        this.confirmButton = confirmButton;
        this.entryButton = entryButton;
        this.textPosition = textPosition;
    }

    private MyAdvancedUIManager(final Parcel source) {
        super(source);
        String s = source.readString();
        final ButtonType confirmButton = s == null ? null : ButtonType.valueOf(s);
        s = source.readString();
        final ButtonType entryButton = s == null ? null : ButtonType.valueOf(s);
        s = source.readString();
        final TextPosition textPosition = s == null ? null : TextPosition.valueOf(s);
        this.confirmButton = confirmButton;
        this.entryButton = entryButton;
        this.textPosition = textPosition;
    }

    @Override
    @Nullable
    public Fragment getHeaderFragment(final LoginFlowState state) {
        Fragment headerFragment;
        switch (state) {
            case PHONE_NUMBER_INPUT:
            case EMAIL_INPUT:
            case EMAIL_VERIFY:
            case SENDING_CODE:
            case SENT_CODE:
            case CODE_INPUT:
            case VERIFYING_CODE:
            case VERIFIED:
            case ACCOUNT_VERIFIED:
            case CONFIRM_ACCOUNT_VERIFIED:
            case CONFIRM_INSTANT_VERIFICATION_LOGIN:
                // insert appropriate customizations for headerFragment
            case ERROR:
                // handle appropriate error for headerFragment
            default:
                headerFragment = new Fragment();
        }

        return headerFragment;
    }

    public @Nullable ButtonType getButtonType(final LoginFlowState state) {
        switch (state) {
            case PHONE_NUMBER_INPUT:
                return entryButton;
            case EMAIL_INPUT:
                return entryButton;
            case CODE_INPUT:
                return confirmButton;
            default:
                return null;
        }
    }

    @Override
    public void onError(final AccountKitError error) {
        // handle error
    }

    @Override
    public void writeToParcel(final Parcel dest, final int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(confirmButton != null ? confirmButton.name() : null);
        dest.writeString(entryButton != null ? entryButton.name() : null);
        dest.writeString(textPosition != null ? textPosition.name() : null);
    }

    public static final Creator<MyAdvancedUIManager> CREATOR
            = new Creator<MyAdvancedUIManager>() {
        @Override
        public MyAdvancedUIManager createFromParcel(final Parcel source) {
            return new MyAdvancedUIManager(source);
        }

        @Override
        public MyAdvancedUIManager[] newArray(final int size) {
            return new MyAdvancedUIManager[size];
        }
    };
} class MyAdvancedUIManager extends BaseUIManager {

    private final ButtonType confirmButton;
    private final ButtonType entryButton;
    private final TextPosition textPosition;

    public MyAdvancedUIManager(
            final ButtonType confirmButton,
            final ButtonType entryButton,
            final LoginType loginType,
            final TextPosition textPosition,
            final int themeResourceId) {
        super(loginType, themeResourceId);
        this.confirmButton = confirmButton;
        this.entryButton = entryButton;
        this.textPosition = textPosition;
    }

    private MyAdvancedUIManager(final Parcel source) {
        super(source);
        String s = source.readString();
        final ButtonType confirmButton = s == null ? null : ButtonType.valueOf(s);
        s = source.readString();
        final ButtonType entryButton = s == null ? null : ButtonType.valueOf(s);
        s = source.readString();
        final TextPosition textPosition = s == null ? null : TextPosition.valueOf(s);
        this.confirmButton = confirmButton;
        this.entryButton = entryButton;
        this.textPosition = textPosition;
    }

    @Override
    @Nullable
    public Fragment getHeaderFragment(final LoginFlowState state) {
        Fragment headerFragment;
        switch (state) {
            case PHONE_NUMBER_INPUT:
            case EMAIL_INPUT:
            case EMAIL_VERIFY:
            case SENDING_CODE:
            case SENT_CODE:
            case CODE_INPUT:
            case VERIFYING_CODE:
            case VERIFIED:
            case ACCOUNT_VERIFIED:
            case CONFIRM_ACCOUNT_VERIFIED:
            case CONFIRM_INSTANT_VERIFICATION_LOGIN:
                // insert appropriate customizations for headerFragment
            case ERROR:
                // handle appropriate error for headerFragment
            default:
                headerFragment = new Fragment();
        }

        return headerFragment;
    }

    public @Nullable ButtonType getButtonType(final LoginFlowState state) {
        switch (state) {
            case PHONE_NUMBER_INPUT:
                return entryButton;
            case EMAIL_INPUT:
                return entryButton;
            case CODE_INPUT:
                return confirmButton;
            default:
                return null;
        }
    }

    @Override
    public void onError(final AccountKitError error) {
        // handle error
    }

    @Override
    public void writeToParcel(final Parcel dest, final int flags) {
        super.writeToParcel(dest, flags);
        dest.writeString(confirmButton != null ? confirmButton.name() : null);
        dest.writeString(entryButton != null ? entryButton.name() : null);
        dest.writeString(textPosition != null ? textPosition.name() : null);
    }

    public static final Creator<MyAdvancedUIManager> CREATOR
            = new Creator<MyAdvancedUIManager>() {
        @Override
        public MyAdvancedUIManager createFromParcel(final Parcel source) {
            return new MyAdvancedUIManager(source);
        }

        @Override
        public MyAdvancedUIManager[] newArray(final int size) {
            return new MyAdvancedUIManager[size];
        }
    };
}
public class CustomAdvancedUIManager extends BaseUIManager {
    /*implementation here */
}
UIManager advancedUIManager = new CustomAdvancedUIManager(loginType, themeId, ...);
configuration.setUIManager(advancedUIManager)

UIManager themeManager = new ThemeUIManager(loginType, themeId);
configuration.setUIManager(themeManager); class CustomAdvancedUIManager extends BaseUIManager {
    /*implementation here */
}
UIManager advancedUIManager = new CustomAdvancedUIManager(loginType, themeId, ...);
configuration.setUIManager(advancedUIManager)

UIManager themeManager = new ThemeUIManager(loginType, themeId);
configuration.setUIManager(themeManager);

Android偏好設置的API:

最多可以爲每位用戶存儲 100 個鍵/值對。鍵是 100 個字符以內的字符串,可以包含大小寫字母、數字和下劃線等字符。值是 1000 個字符以內的字符串。

// Load all preferences for this account:
    AccountKit.getAccountPreferences().loadPreferences(new PrefsLoadListener());
    // Load a specific preference:
    AccountKit.getAccountPreferences().loadPreference("nickname", new SinglePrefLoadListener());
    // Set a preference:
    AccountKit.getAccountPreferences().setPreference("favoritecolor", "3b5998", new PrefSetListener());
    // Delete a preference:
    AccountKit.getAccountPreferences().loadPreference("timesincelastlogin ", new PrefDeleteListener());

    AccountKit.getAccountPreferences().loadPreferences(new PrefsLoadListener());
    // Load a specific preference:
    AccountKit.getAccountPreferences().loadPreference("nickname", new SinglePrefLoadListener());
    // Set a preference:
    AccountKit.getAccountPreferences().setPreference("favoritecolor", "3b5998", new PrefSetListener());
    // Delete a preference:
    AccountKit.getAccountPreferences().loadPreference("timesincelastlogin ", new PrefDeleteListener());
private class PrefsLoadListener implements AccountPreferences.OnLoadPreferencesListener {
    public void onLoadPreferences(
        @Nullable Map<String, String> preferences,
        @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }
      // You now have access to all existing user preferences in a Map
    }
  }

  private class SinglePrefLoadListener implements AccountPreferences.OnLoadPreferenceListener {
    public void onLoadPreference(String key, @Nullable String value, @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }
      // ... use the delivered value and key ...
    }
  }

  private class PrefSetListener implements AccountPreferences.OnSetPreferenceListener {
    public void onSetPreference(String key, String value, @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }

      // ... use the delivered value and key ...
    }
  }

  private class PrefDeleteListener implements AccountPreferences.OnDeletePreferenceListener {
    public void onDeletePreference(String key, @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }
      // You have been notified that the value associated with "key" was deleted
    }
  } class PrefsLoadListener implements AccountPreferences.OnLoadPreferencesListener {
    public void onLoadPreferences(
        @Nullable Map<String, String> preferences,
        @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }
      // You now have access to all existing user preferences in a Map
    }
  }

  private class SinglePrefLoadListener implements AccountPreferences.OnLoadPreferenceListener {
    public void onLoadPreference(String key, @Nullable String value, @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }
      // ... use the delivered value and key ...
    }
  }

  private class PrefSetListener implements AccountPreferences.OnSetPreferenceListener {
    public void onSetPreference(String key, String value, @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }

      // ... use the delivered value and key ...
    }
  }

  private class PrefDeleteListener implements AccountPreferences.OnDeletePreferenceListener {
    public void onDeletePreference(String key, @Nullable AccountKitError error) {
      if (error != null) {
        // ... handle error appropriately ...
        return;
      }
      // You have been notified that the value associated with "key" was deleted
    }
  }

 

 

 

二,用戶註冊登錄

最總訪問口令:

 

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

    callbackManager = CallbackManager.Factory.create();

    accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(
            AccessToken oldAccessToken,
            AccessToken currentAccessToken) {
                // Set the access token using 
                // currentAccessToken when it's loaded or set.
        }
    };
    // If the access token is available already assign it.
    accessToken = AccessToken.getCurrentAccessToken();
}

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

@Override
public void onDestroy() {
    super.onDestroy();
    accessTokenTracker.stopTracking();
}
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    callbackManager = CallbackManager.Factory.create();

    accessTokenTracker = new AccessTokenTracker() {
        @Override
        protected void onCurrentAccessTokenChanged(
            AccessToken oldAccessToken,
            AccessToken currentAccessToken) {
                // Set the access token using 
                // currentAccessToken when it's loaded or set.
        }
    };
    // If the access token is available already assign it.
    accessToken = AccessToken.getCurrentAccessToken();
}

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

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

追蹤當前個人資料:

 

 

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

    callbackManager = CallbackManager.Factory.create();

    profileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(
                Profile oldProfile,
                Profile currentProfile) {
            // App code
        }
    };
}

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

@Override
public void onDestroy() {
    super.onDestroy();
    profileTracker.stopTracking();
}
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    callbackManager = CallbackManager.Factory.create();

    profileTracker = new ProfileTracker() {
        @Override
        protected void onCurrentProfileChanged(
                Profile oldProfile,
                Profile currentProfile) {
            // App code
        }
    };
}

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

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

 

三,Facebook分享

Facebook的分享,有一個前提條件,就是應用必須已經安裝,才能夠分享。

鏈接的分享:ShareLinkContent模型進行。

      截至 2017 年 4 月 18 日,圖譜 API 版本 2.9 及更高版本不再支持下列參數。對於版本 2.8 及更低版本,這些參數將繼續有效,直到 2017 年 7 月 17 日。
          contentTitle,表示鏈接中的內容的標題,imageURL,將在帖子中顯示的縮略圖的網址,內容的 contentDescription,通常爲 2-4 個句子

ShareLinkContent content = new ShareLinkContent.Builder()
        .setContentUrl(Uri.parse("https://developers.facebook.com"))
        .build();

照片分享:小於12MB,客戶端在7.0以上,SharePhotoContent模型進行。

 

Bitmap image = ...
SharePhoto photo = new SharePhoto.Builder()
        .setBitmap(image)
        .build();
SharePhotoContent content = new SharePhotoContent.Builder()
        .addPhoto(photo)
        .build(); image = ...
SharePhoto photo = new SharePhoto.Builder()
        .setBitmap(image)
        .build();
SharePhotoContent content = new SharePhotoContent.Builder()
        .addPhoto(photo)
        .build();

 

視頻分享:小於12MB,ShareVideoContent模型進行

 

Uri videoFileUri = ...
ShareVideo = new ShareVideo.Builder()
        .setLocalUrl(videoUrl)
        .build();
ShareVideoContent content = new ShareVideoContent.Builder()
        .setVideo(video)
        .build(); videoFileUri = ...
ShareVideo = new ShareVideo.Builder()
        .setLocalUrl(videoUrl)
        .build();
ShareVideoContent content = new ShareVideoContent.Builder()
        .setVideo(video)
        .build();

多媒體分享:

 

用戶需要安裝版本 71 或以上的原生 Android 版 Facebook 應用。
照片大小必須小於 12MB。
視頻大小必須小於 12MB。
用戶每次可以分享最多包含 6 個照片和視頻元素的內容。

 

SharePhoto sharePhoto1 = new SharePhoto.Builder()
    .setBitmap(...)
    .build();
SharePhoto sharePhoto2 = new SharePhoto.Builder()
    .setBitmap(...)
    .build();
ShareVideo shareVideo1 = new ShareVideo.Builder()
    .setLocalUrl(...)
    .build();
ShareVideo shareVideo2 = new ShareVideo.Builder()
    .setLocalUrl(...)
    .build();

ShareContent shareContent = new ShareMediaContent.Builder()
    .addMedium(sharePhoto1)
    .addMedium(sharePhoto2)
    .addMedium(shareVideo1)
    .addMedium(shareVideo2)
    .build();

ShareDialog shareDialog = new ShareDialog(...);
shareDialog.show(shareContent, Mode.AUTOMATIC); sharePhoto1 = new SharePhoto.Builder()
    .setBitmap(...)
    .build();
SharePhoto sharePhoto2 = new SharePhoto.Builder()
    .setBitmap(...)
    .build();
ShareVideo shareVideo1 = new ShareVideo.Builder()
    .setLocalUrl(...)
    .build();
ShareVideo shareVideo2 = new ShareVideo.Builder()
    .setLocalUrl(...)
    .build();

ShareContent shareContent = new ShareMediaContent.Builder()
    .addMedium(sharePhoto1)
    .addMedium(sharePhoto2)
    .addMedium(shareVideo1)
    .addMedium(shareVideo2)
    .build();

ShareDialog shareDialog = new ShareDialog(...);
shareDialog.show(shareContent, Mode.AUTOMATIC);

“贊”按鈕
“贊”按鈕是用戶與好友分享內容的快捷途徑。輕觸“贊”按鈕即可爲應用中的內容點“贊”,並將內容分享到 Facebook。

 

 

LikeView likeView = (LikeView) findViewById(R.id.like_view);
likeView.setObjectIdAndType(
    "https://www.facebook.com/FacebookDevelopers",
    LikeView.ObjectType.PAGE); likeView = (LikeView) findViewById(R.id.like_view);
likeView.setObjectIdAndType(
    "https://www.facebook.com/FacebookDevelopers",
    LikeView.ObjectType.PAGE);

 

 

 

“分享”按鈕
“分享”按鈕將調用分享對話框。要添加“分享”按鈕

 

ShareButton shareButton = (ShareButton)findViewById(R.id.fb_share_button);
shareButton.setShareContent(content); shareButton = (ShareButton)findViewById(R.id.fb_share_button);
shareButton.setShareContent(content);

分享對話框
分享對話框會切換到原生 Android 版 Facebook 應用,並在發佈帖子後將控制權交還您的應用。如果未安裝 Facebook 應用,會自動回退到網頁對話框。

 

 

     callbackManager = CallbackManager.Factory.create();
        shareDialog = new ShareDialog(this);
        // this part is optional
        shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() { ... });
= CallbackManager.Factory.create();
        shareDialog = new ShareDialog(this);
        // this part is optional
        shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() { ... });
if (ShareDialog.canShow(ShareLinkContent.class)) {
    ShareLinkContent linkContent = new ShareLinkContent.Builder()
            .setContentUrl(Uri.parse("http://developers.facebook.com/android"))
            .build();
    shareDialog.show(linkContent);
} (ShareDialog.canShow(ShareLinkContent.class)) {
    ShareLinkContent linkContent = new ShareLinkContent.Builder()
            .setContentUrl(Uri.parse("http://developers.facebook.com/android"))
            .build();
    shareDialog.show(linkContent);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);
}

 

話題標籤:

英文分享:

自定義界面:

分享鏈接:

另外Facebook 同時也提供了分享,推送,Messager(基於Webhook),社交,邀請,廣告,應用分析等開發者工具。

其他的也沒什麼說的,這裏提供一下官方給的例子吧:

       https://github.com/fbsamples/account-kit-samples-for-android

 

發佈了154 篇原創文章 · 獲贊 123 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章