整体来说,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" /><activityandroid: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" /><activityandroid:name="com.facebook.accountkit.ui.AccountKitActivity" />

根据应用的情况,可能需要更多的配置,允许AccountKitActivity的启动,

<activityandroid: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@Nullablepublic 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 headerFragmentcase ERROR:// handle appropriate error for headerFragmentdefault: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;}}@Overridepublic void onError(final AccountKitError error) {// handle error}@Overridepublic 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>() {@Overridepublic MyAdvancedUIManager createFromParcel(final Parcel source) {return new MyAdvancedUIManager(source);}@Overridepublic 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@Nullablepublic 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 headerFragmentcase ERROR:// handle appropriate error for headerFragmentdefault: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;}}@Overridepublic void onError(final AccountKitError error) {// handle error}@Overridepublic 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>() {@Overridepublic MyAdvancedUIManager createFromParcel(final Parcel source) {return new MyAdvancedUIManager(source);}@Overridepublic 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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() {@Overrideprotected 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 optionalshareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() { ... });
= CallbackManager.Factory.create();shareDialog = new ShareDialog(this);// this part is optionalshareDialog.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

facebook登录和分享相关推荐

  1. (unity)新手接入Facebook登录,分享以及google登录,Android,IOS,OC接入篇

    最近接Android,IOS的Facebook登录,分享 以及Google登录,分享流程以及遇到的问题整理. 一. Android接入 google登录 第一步,前往 [ firebase] http ...

  2. Facebook 登录、分享

    第一次做海外项目,遇到需求,需要接入Facebook登录与分享. 只说遇到的麻烦,1.登录,「网址发不了--」 首先,创建应用,这里需要注意,创建完应用后,要按需开放部分权限,否则无法唤起应用, 另外 ...

  3. 视频直播平台源码关于Facebook登录、分享接入流程

    现在,视频直播平台移民三方账号登录.分享功能是最基本的功能设置,而且随着互联网技术的发展,很多视频直播平台源码需要对Facebook.Twitter.Line等国外APP进行接入,从而实现用户流量的增 ...

  4. Android 集成facebook 登录和分享

    ,开场白给大脸书 导入SDK dependencies { compile 'com.facebook.android:facebook-android-sdk:4.15.0' app_id在stri ...

  5. facebook、twitter、facebook登录、whatsapp分享、微信分享

    facebook.twitter.facebook 登录.whatsapp 分享.微信分享 几个概念 爬虫 所谓爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. html 元素图谱 对 ...

  6. Android facebook VK 登录与分享 开源SDK

    自己封好的SDK 直接调用 就可以登录 包含facebook VK 登录分享 首先导入SDK 在项目gradle 添加FB,VK的引用 如果你不需要修改源码 直接导入arr文件 比较方便 reposi ...

  7. Android 集成原生google,facebook 登录分享sdk

    前言 海外版app集成三方登录分享,早期采用umeng sdk,由于googleplay对用户隐私及用户数据的使用有比较严格规定.正好 umeng sdk会后台采集app信息,触发用户隐私相关政策条款 ...

  8. web dialog 内嵌 图片_Unity游戏如何在iOS上调用Facebook原生对话框分享图片

    原文发表于Unity中国论坛 ,如果对你有帮助请关注我! Unity游戏如何在iOS上调用Facebook原生对话框分享图片 - Unity​unity.cn 手头上的一个游戏项目需要实现截屏并分享到 ...

  9. 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...

  10. android qq授权申请appkey,手把手带你集成友盟实现授权登录、分享

    android.jpg 集成准备(获取AppKey) 第一步.png 第二步.png 第三步.png 第四步.png 第五步.png 第六步.png 这里就可以拿到友盟的AppKey了接下来集成友盟 ...

最新文章

  1. R语言描述性统计分析:假设检验
  2. UA OPTI512R 傅立叶光学导论15 2-D Fourier变换与Hankel变换
  3. 基于ASP.NET MVC框架开发Web论坛应用程序
  4. 在CF卡上建立文件系统和安装引导加载程序
  5. micropython教程nucleo-f767zi开发板_Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)...
  6. ThinkPHP 数据库操作,插入,更新,删除,查询
  7. msvcr80.dll 问题
  8. 简单的VB进度条程序
  9. Java集合面试题看这篇就够了
  10. msfconsole的简单使用
  11. FPGA时钟电路PCBlayout设计原则
  12. 腾讯云2022年双11云服务器配置及报价表汇总
  13. golang: grpc: received message larger than max
  14. JAVA并发编程的书籍及资料
  15. python tokenize怎么用_tokenize --- 对 Python 代码使用的标记解析器 — Python 3.9.1 說明文件...
  16. linux 重启apache:apachectl -k graceful
  17. 41. Fast File System (FFS)
  18. 手把手教你:基于TensorFlow的语音识别系统
  19. hdmi怎么支持2k分辨率_官方确认!PS5将不支持原生2K分辨率,双11次世代设备升级注意排雷...
  20. 台积电股价突破万亿大关 创下台股历史新高

热门文章

  1. 吃着火锅唱着歌,我了解到海底捞的信息化太厉害了
  2. 两台电脑通过网线直连共享数据(超详细)
  3. HihoCoder - 1829 Tomb Raider (暴力+最长上升子序列)
  4. 软件项目管理1~11章期末复习题
  5. Chalcolithic 铜石并用时代
  6. 清华大学计算机系毕业论文 android,清华大学计算机科学与技术系
  7. 没有钱到底要不要创业?
  8. Android体重档案代码,Android开发实现的标准体重计算器功能示例
  9. CentOS cp 复制隐藏文件提示 cp: cannot stat ?.xxx*?. No such file or directory
  10. Unity 3D中级项目:捕鱼达人