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" /><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登录和分享相关推荐
- (unity)新手接入Facebook登录,分享以及google登录,Android,IOS,OC接入篇
最近接Android,IOS的Facebook登录,分享 以及Google登录,分享流程以及遇到的问题整理. 一. Android接入 google登录 第一步,前往 [ firebase] http ...
- Facebook 登录、分享
第一次做海外项目,遇到需求,需要接入Facebook登录与分享. 只说遇到的麻烦,1.登录,「网址发不了--」 首先,创建应用,这里需要注意,创建完应用后,要按需开放部分权限,否则无法唤起应用, 另外 ...
- 视频直播平台源码关于Facebook登录、分享接入流程
现在,视频直播平台移民三方账号登录.分享功能是最基本的功能设置,而且随着互联网技术的发展,很多视频直播平台源码需要对Facebook.Twitter.Line等国外APP进行接入,从而实现用户流量的增 ...
- Android 集成facebook 登录和分享
,开场白给大脸书 导入SDK dependencies { compile 'com.facebook.android:facebook-android-sdk:4.15.0' app_id在stri ...
- facebook、twitter、facebook登录、whatsapp分享、微信分享
facebook.twitter.facebook 登录.whatsapp 分享.微信分享 几个概念 爬虫 所谓爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. html 元素图谱 对 ...
- Android facebook VK 登录与分享 开源SDK
自己封好的SDK 直接调用 就可以登录 包含facebook VK 登录分享 首先导入SDK 在项目gradle 添加FB,VK的引用 如果你不需要修改源码 直接导入arr文件 比较方便 reposi ...
- Android 集成原生google,facebook 登录分享sdk
前言 海外版app集成三方登录分享,早期采用umeng sdk,由于googleplay对用户隐私及用户数据的使用有比较严格规定.正好 umeng sdk会后台采集app信息,触发用户隐私相关政策条款 ...
- web dialog 内嵌 图片_Unity游戏如何在iOS上调用Facebook原生对话框分享图片
原文发表于Unity中国论坛 ,如果对你有帮助请关注我! Unity游戏如何在iOS上调用Facebook原生对话框分享图片 - Unityunity.cn 手头上的一个游戏项目需要实现截屏并分享到 ...
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9057257 由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字 ...
- android qq授权申请appkey,手把手带你集成友盟实现授权登录、分享
android.jpg 集成准备(获取AppKey) 第一步.png 第二步.png 第三步.png 第四步.png 第五步.png 第六步.png 这里就可以拿到友盟的AppKey了接下来集成友盟 ...
最新文章
- R语言描述性统计分析:假设检验
- UA OPTI512R 傅立叶光学导论15 2-D Fourier变换与Hankel变换
- 基于ASP.NET MVC框架开发Web论坛应用程序
- 在CF卡上建立文件系统和安装引导加载程序
- micropython教程nucleo-f767zi开发板_Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)...
- ThinkPHP 数据库操作,插入,更新,删除,查询
- msvcr80.dll 问题
- 简单的VB进度条程序
- Java集合面试题看这篇就够了
- msfconsole的简单使用
- FPGA时钟电路PCBlayout设计原则
- 腾讯云2022年双11云服务器配置及报价表汇总
- golang: grpc: received message larger than max
- JAVA并发编程的书籍及资料
- python tokenize怎么用_tokenize --- 对 Python 代码使用的标记解析器 — Python 3.9.1 說明文件...
- linux 重启apache:apachectl -k graceful
- 41. Fast File System (FFS)
- 手把手教你:基于TensorFlow的语音识别系统
- hdmi怎么支持2k分辨率_官方确认!PS5将不支持原生2K分辨率,双11次世代设备升级注意排雷...
- 台积电股价突破万亿大关 创下台股历史新高
热门文章
- 吃着火锅唱着歌,我了解到海底捞的信息化太厉害了
- 两台电脑通过网线直连共享数据(超详细)
- HihoCoder - 1829 Tomb Raider (暴力+最长上升子序列)
- 软件项目管理1~11章期末复习题
- Chalcolithic 铜石并用时代
- 清华大学计算机系毕业论文 android,清华大学计算机科学与技术系
- 没有钱到底要不要创业?
- Android体重档案代码,Android开发实现的标准体重计算器功能示例
- CentOS cp 复制隐藏文件提示 cp: cannot stat ?.xxx*?. No such file or directory
- Unity 3D中级项目:捕鱼达人