facebook_facebookiphone - CSDN
  • facebook登录和分享

    2019-08-20 15:46:54
    整体来说,Facebook在国际化中做的是非常好的。也是,Twitter和YouTube都是Google自己家的,在中国政府受挫之后,就不方便投入太多,怎么做都好像一个血脉,一个味道。 然后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

     

    展开全文
  • Facebook注册机_Facebook账号注册_Csharp代码示例_.Net代码

    【Facebook注册机_Facebook账号注册_Csharp代码示例_.Net代码】

    朋友叫了很久帮忙写,无奈今天花时间研究下。。。。

    下面只是一个简单示例,

    里面我写有一些类,对于写注册机之类的,或许有帮助哟!!


    ======================================



    注册是成功了,可登录发现跳出手机验证。。。。



    部分代码:


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace Register
    {
        public partial class Form1 : Form
        {
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                button1.Enabled = false;
                Notify("*********开始**********", 2);
                //设置参数
                string xing = EnVon.Helper.ChineseHelper.GetXing();
                string ming = EnVon.Helper.ChineseHelper.GetMing(2);
                string email = Helper.ChineseHelper.GetPinYin(xing + ming).ToLower() + Helper.StringHelper.GetEmailDomain();
                string password = EnVon.Helper.StringHelper.RndString(4) + EnVon.Helper.StringHelper.RndString(5, 1);
                string birYear = Helper.StringHelper.RndNumberS(1980, 1996);
                string birMonth = Helper.StringHelper.RndNumberS(1, 13);
                string birDay = Helper.StringHelper.RndNumberS(1, 29);
                string retData = string.Empty;
                //创建对象
                Facebook.Register reg = new Facebook.Register()
                {
                    birthday_day = birDay, //生日日
                    birthday_month = birMonth, //生日月
                    birthday_year = birYear, //生日年
                    firstname = ming, //名字
                    lastname = xing, //姓
                    reg_email__ = email, //邮箱
                    reg_email_confirmation__ = email, //确认邮箱
                    reg_passwd__ = password //密码
                };
                //打开注册页
                Notify("打开注册页。。。");
                int retB = reg.OpenRegPage();
                if (retB == 0)
                {
                    Thread.Sleep(200);
                    Notify("提交注册表单。。。");
                    //提交注册
                    retB = reg.PostForm(out retData);
                    if (retB == 0)
                    {
                        Notify("恭喜,注册成功!!");
                        Notify("-----------------------------");
                        Notify("姓名:" + xing + ming);
                        Notify("邮箱:" + email);
                        Notify("密码:" + password);
                        Notify("生日:" + birYear + "-" + birMonth + "-" + birDay);
                        Notify("-----------------------------");
                    }
                    else if (retB == 1)
                    {
                        Notify("注册失败!");
                        Notify("失败原因:邮箱已注册过!");
                    }
                    else
                    {
                        Notify("注册失败!");
                        Notify("失败原因:" + reg.GetErrMessage(retData));
                    }
                    rtxtData.Text = retData;
                }
                else
                {
                    Notify("打开注册页失败!");
                }
                Notify("*********完毕**********");
                button1.Enabled = true;
            }
    
    
            private void button2_Click(object sender, EventArgs e)
            {
            }
    
    
            private void Notify(string str, int mode = 8)
            {
                if (mode == 8)
                {
                    rtxtMain.Text += DateTime.Now + " " + str + "\r\n";
                }
                else
                {
                    rtxtMain.Text = DateTime.Now + " " + str + "\r\n";
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                this.Text = "Facebook账号注册示例";
            }
    
    
        }
    }
    

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Facebook
    {
        /// <summary>
        /// Facebook账号注册
        /// </summary>
        public class Register
        {
            private Random RND = new Random();
            private EnVon.HttpRequest http = null;
    
            #region 注册的参数
            public string lastname { get; set; }
            public string firstname { get; set; }
            public string reg_email__ { get; set; }
            public string reg_email_confirmation__ { get; set; }
            public string reg_passwd__ { get; set; }
            public string birthday_year { get; set; }
            public string birthday_month { get; set; }
            public string birthday_day { get; set; }
            private string lsd { get; set; }
            private string sex
            {
                get { return string.Empty + RND.Next(1, 3); }
                set { }
            }
            private string referrer { get; set; }
            private string asked_to_login { get; set; }
            private string terms { get; set; }
            private string ab_test_data { get; set; }
            private string contactpoint_label { get; set; }
            private string locale { get; set; }
            private string abtest_registration_group { get; set; }
            private string reg_instance { get; set; }
            private string captcha_persist_data { get; set; }
            private string captcha_session { get; set; }
            private string extra_challenge_params { get; set; }
            private string recaptcha_type { get; set; }
            private string captcha_response { get; set; }
            private string ignore { get; set; }
            private string __user { get; set; }
            private string __a { get; set; }
            private string __dyn { get; set; }
            private string __req { get; set; }
            private string __rev { get; set; } 
            #endregion
    
    
            public Register()
            {
                __req = "5";
                //__dyn = "7wiXwNAwsUKEkzoynFwh8";
                __a = "1";
                __user = "0";
                ignore = "captcha";
                captcha_response = "";
                recaptcha_type = "password";
                abtest_registration_group = "1";
                locale = "zh_CN";
                contactpoint_label = "email_only";
                terms = "on";
                asked_to_login = "0";
                referrer = "";
                http = new EnVon.HttpRequest();
                http.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.3; WOW64; Trident/7.0)";
            }
    
            /// <summary>
            /// 打开注册页并获取部分参数
            /// </summary>
            /// <returns></returns>
            public int OpenRegPage()
            {
                string url = "https://www.facebook.com/";
                string data = http.GetData(url, "utf-8");
                if (data.Length > 100)
                {
                    var arr = Helper.StringHelper.MidMulti(data, "<input", ">");
                    __rev = Helper.StringHelper.Mid(data, "\"revision\":", ",");
                    //ab_test_data = "AAAP/P/f/fAAPAAAfAAPfAAAPAAAfAPAAAAAAAAAO/VMEAACCCOBBM";//???
                    captcha_persist_data = GetInputValue(arr, "captcha_persist_data");
                    captcha_session = GetInputValue(arr, "captcha_session");
                    extra_challenge_params = GetInputValue(arr, "extra_challenge_params");
                    lsd = GetInputValue(arr, "lsd");
                    reg_instance = GetInputValue(arr, "reg_instance");
                    return 0;
                }
                return 1;
            }
    
            /// <summary>
            /// 提交注册表单
            /// </summary>
            /// <returns></returns>
            public int PostForm(out string html)
            {
                int retB = -1;
                string pUrl = "https://www.facebook.com/ajax/register.php";
                string pRef = "https://www.facebook.com/";
                string pData = string.Empty;
                //拼接pData
                Dictionary<string, string> dicParams = new Dictionary<string, string>();
                dicParams.Add("__a", __a);
                dicParams.Add("__dyn", __dyn);
                dicParams.Add("__req", __req);
                dicParams.Add("__rev", __rev);
                dicParams.Add("__user", __user);
                dicParams.Add("ab_test_data", ab_test_data);
                dicParams.Add("abtest_registration_group", abtest_registration_group);
                dicParams.Add("asked_to_login", asked_to_login);
                dicParams.Add("birthday_day", birthday_day);
                dicParams.Add("birthday_month", birthday_month);
                dicParams.Add("birthday_year", birthday_year);
                dicParams.Add("captcha_persist_data", captcha_persist_data);
                dicParams.Add("captcha_response", captcha_response);
                dicParams.Add("captcha_session", captcha_session);
                dicParams.Add("contactpoint_label", contactpoint_label);
                dicParams.Add("extra_challenge_params", extra_challenge_params.Replace("&", "&"));
                dicParams.Add("firstname", firstname);
                dicParams.Add("ignore", ignore);
                dicParams.Add("lastname", lastname);
                dicParams.Add("locale", locale);
                dicParams.Add("lsd", lsd);
                dicParams.Add("recaptcha_type", recaptcha_type);
                dicParams.Add("referrer", referrer);
                dicParams.Add("reg_email__", reg_email__);
                dicParams.Add("reg_email_confirmation__", reg_email_confirmation__);
                dicParams.Add("reg_instance", reg_instance);
                dicParams.Add("reg_passwd__", reg_passwd__);
                dicParams.Add("sex", sex);
                dicParams.Add("terms", terms);
                foreach (string item in dicParams.Keys)
                {
                    pData += (pData.Length > 0 ? "&" : "") + item + "=" + Helper.StringHelper.UrlEncode(dicParams[item]);
                }
                //提交数据
                html = http.PostData(pUrl, pData, "utf-8", pRef);
                if (html.IndexOf("registration_succeeded\":true") > 0)
                {
                    if (html.IndexOf("redirect\":\"\\/register\\/confirm.php") > 0)
                    {
                        retB = 1;//邮箱已注册过
                    }
                    else { retB = 0;/*注册成功*/ }
                }
                return retB;
            }
    
            /// <summary>
            /// 取错误提示信息
            /// </summary>
            /// <param name="retData"></param>
            /// <returns></returns>
            public string GetErrMessage(string retData)
            {
                string str = EnVon.Helper.StringHelper.UnicodeDecode(retData);
                str = Helper.StringHelper.FiltHtml(str);
                str = Helper.StringHelper.Mid(str, "{\"__html\":\"", "\"},\"error_code");
                return str;
            }
    
    
            private string GetInputValue(List<string> list, string name)
            {
                string str = string.Empty;
                foreach (string item in list)
                {
                    if (item.IndexOf("name=\"" + name + "\"") > 0)
                    {
                        str = Helper.StringHelper.Mid(item,"value=\"","\"" );
                        break;
                    }
                }
                return str;
            }
    
    
        }
    }
    


    使用VS2013编写,源码下载:

    http://download.csdn.net/detail/envon123/7327619


    =========================================================

    END


    
    展开全文
  • FaceBook登录接入

    2019-03-29 15:57:08
    官方文档Facebook登录接入Android官方文档创建应用首先去Facebook开发者平台注册一个开发者账户,这里需要翻墙,在后台添加一个自己的应用SDK集成SDK的集成方式有两种 Maven方式 在您的项目中,打开 your_app > ...

    ###官方文档
    Facebook登录接入Android官方文档
    ###创建应用
    首先去Facebook开发者平台注册一个开发者账户,这里需要翻墙,在后台添加一个自己的应用

    ###SDK集成
    SDK的集成方式有两种

    • Maven方式
    • 在您的项目中,打开 your_app > Gradle Scripts > build.gradle (Project),确保下列存储库都添加到 buildscript { repositories {}} 中
    jcenter() 
    
    • 在您的项目中,打开 your_app > Gradle Scripts > build.gradle (Module: app) 并将下列执行语句添加到 dependencies{} 部分,以便依赖于最新版的 Facebook 登录 SDK:
     implementation 'com.facebook.android:facebook-login:[4,5)'
    
    
    • Jar导入方式
      下载Facebook最新的SDK jar包放到项目的libs文件夹下。
      SDK下载地址是:Facebook SDK下载地址

    ###编辑资源和清单

    • 打开 /app/res/values/strings.xml 文件
    <string name="facebook_app_id">15477621189....</string>
    <string name="fb_login_protocol_scheme">fb15477621189....</string>
    
    • 打开 /app/manifest/AndroidManifest.xml 文件
      • 添加权限
    <uses-permission android:name="android.permission.INTERNET"/>
    
    • 在 application 元素中添加以下 meta-data 元素以及相应的Activity
    <meta-data android:name="com.facebook.sdk.ApplicationId" 
            android:value="@string/facebook_app_id"/>
        
        <activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                    "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name" />
        <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <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/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>
    
    

    ###填入APP的包名
    在Facebook控制后台填入即可

    ###为应用提供开发和发布秘钥散列
    首先,需要三个工具:

    • keytool : JDK中默认已经有了
    • windows openssl函数库
    • keystore:debug.keystore 以及应用正式上线的keystore

    其次,利用命令行cmd去生成调试以及正式的keystore秘钥散列, cmd渠道JDK的目录下,输入一下命令,注意调整自己的各种路径,debug.keystore的密码默认是没有的,直接回车就好

    • 调试版秘钥散列
    keytool -exportcert -alias androiddebugkey -keystore "C:\Users\USERNAME\.android\debug.keystore" | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" sha1 -binary | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" base64
    
    
    • 正式版秘钥散列
    keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64
    

    生成出来秘钥散列的是28个字符的字符串,类似于以下

    QvoiWD1LQEfDIrvczaq31WCJZjX=
    

    ###SDK的API使用

    • SDK的初始化登录回调,在onCreate()中调用
    callbackManager = CallbackManager.Factory.create();
            LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    Log.e(TAG, "登录成功: " + loginResult.getAccessToken().getToken());
                    loginResult.getAccessToken().getApplicationId();
                    loginResult.getAccessToken().getUserId();
                }
    
                @Override
                public void onCancel() {
                    Log.e(TAG, "登录取消");
                }
    
                @Override
                public void onError(FacebookException error) {
                    Log.e(TAG, "登录错误");
                }
            });
    
    • 在你需要调用登录的地方调用登录接口
    LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile"));
    
    • 在 onActivityResult 方法中调用 callbackManager.onActivityResult,通过 callbackManager 将登录结果传递至 LoginManager
          @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            callbackManager.onActivityResult(requestCode, resultCode, data);
            super.onActivityResult(requestCode, resultCode, data);
        }
    

    这样一个简单的Facebook登录客户端API已经完成了,如果需要服务端校验,各家的校验方式都不一样,可以参考访问口令

    ###应用测试

    • 测试手机:需要翻墙
      • 需要有google play服务,可以到各大应用商店下载:谷歌安装器
      • google play商店下载Facebook app
    • 将代买debug安装到手机运行测试

    ###注意事项

    • 将自己的debug.keystore生成散列秘钥配置到Facebook控制后台,要不然debug出来的app安装到手机会不可用
    • 注意自己的申请参数正确配置到:/app/res/values/strings.xml中
    • 如果在Facebook控制后台配置了包名,请确保自己应用的包名和Facebook配置的一样

    ###常见问题

    facebook onErrorSERVER_ERROR: [code] 1675030 [message]: 执行查询时出错。 [extra]:

    解答:因为该Facebook 账号不是测试账号

    展开全文
  • Facebook Message

    2020-07-30 23:30:32
    Analysis of HDFS Under HBase: A Facebook Messages Case Study
  • Facebook登录接入Demo

    2020-07-30 23:32:15
    Facebook登录接入Demo
  • Facebook 登录和分享

    2019-01-29 16:02:59
    Facebook 登录和分享
                    因项目要求,需要实现FaceBook的登录和分享,于是 百度+google+翻墙。终于实现了!一下希望对你能起到帮助
    1.首先要申请账号,下载Sdk  因为连接国外的网站所以需要做点处理
        https://www.vcupmars.com/user/2384183/myvpn  可申请账号  然后设置Vpn(不会设置的童鞋自行百度)
       连接上了之后 进行app注册

     注意此处的hashKey  对你程序能登录和分享成功有很大关系  有两种获取方法  代码和cmd

      代码

    try {

           PackageInfo info = getPackageManager().getPackageInfo(

                   "com.baidu.pushtest", 

                   PackageManager.GET_SIGNATURES);

           for (Signature signature : info.signatures) {

               MessageDigest md = MessageDigest.getInstance("SHA");

               md.update(signature.toByteArray());

               String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);

               Log.d("KeyHash:", "KeyHash:"+KeyHash);//两次获取的不一样  此处取第一个的值

               Toast.makeText(this, "FaceBook HashKey:"+KeyHash, Toast.LENGTH_SHORT).show();

           }

       } catch (NameNotFoundException e) {

       } catch (NoSuchAlgorithmException e) {

       }


    CMD

    获取哈希值的方法: 
    下载 openssl-0.9.8k_WIN32  下载地址:http://download.csdn.net/detail/h7870181/5054864    
    或者直接本文最下面附件中下载 
    下载完成后,解压到C盘根目录 
    进入cmd  粘贴以下字符串,keystore默认密码为android 注意不要写错了。出来一串字符则为我们所需要的哈希值。 
    keytool -export -alias myAlias -keystore C:\Users\Administrator\.android\debug.keystore | C:\openssl-0.9.8k_WIN32\bin\openssl sha1 -binary | C:\openssl-0.9.8k_WIN32\bin\openssl enc -a -e 


    填写完之后就是下载SDK了

     官网可以下载,可怜的我连接的VPN不能下载,只能到git上面去找了:https://github.com/facebook/facebook-android-sdk

    下载解压之后

    facebook需要导入项目用作libs  samples是官方Demo  加入libs下的两个jar包 

     自行导入修改应该是没有问题的 如有问题就是jar包导错了,自行看问题解决问题


    2.ok此时我们可以往自己项目中加入libs 并Coding了


    public class FaceBookTest extends Activity implements OnClickListener{

    private Button m_face_login;

    private Button m_face_share;

    private Button m_face_login_out;

    private UiLifecycleHelper uiHelper;

    private Session.StatusCallback statusCallback = new SessionStatusCallback();


    @Override

    protected void onCreate(Bundle savedInstanceState) {

    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);

    setContentView(R.layout.face);

    uiHelper = new UiLifecycleHelper(this, callback);

            uiHelper.onCreate(savedInstanceState);

    initlayout();

    try {

           PackageInfo info = getPackageManager().getPackageInfo(

                   "com.baidu.pushtest", 

                   PackageManager.GET_SIGNATURES);

           for (Signature signature : info.signatures) {

               MessageDigest md = MessageDigest.getInstance("SHA");

               md.update(signature.toByteArray());

               String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);

               Log.d("KeyHash:", "KeyHash:"+KeyHash);//两次获取的不一样  此处取第一个的值

               Toast.makeText(this, "FaceBook HashKey:"+KeyHash, Toast.LENGTH_SHORT).show();

    //            Toast.makeText(this, "FaceBook HashKey:"+Base64.encodeToString(md.digest(), Base64.DEFAULT), Toast.LENGTH_SHORT).show();

    //            System.out.println("KeyHash:"+Base64.encodeToString(md.digest(), Base64.DEFAULT));

           }

       } catch (NameNotFoundException e) {


       } catch (NoSuchAlgorithmException e) {


       }

    }

    private void initlayout(){

    m_face_login = (Button) this.findViewById(R.id.face_login);

    m_face_share = (Button) this.findViewById(R.id.face_share);

    m_face_login_out = (Button) this.findViewById(R.id.face_login_out);

    m_face_login.setOnClickListener(this);

    m_face_share.setOnClickListener(this);

    m_face_login_out.setOnClickListener(this);

    }

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    // Session.getActiveSession().onActivityResult(this, requestCode,resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {

           @Override

           public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {

               Log.e("Activity", String.format("Error: %s", error.toString()));

           }


           @Override

           public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {

               Log.i("Activity", "Success!");

               String result = data.getString("com.facebook.platform.extra.COMPLETION_GESTURE");//cancel取消   post成功

    //            String result = FacebookDialog.getNativeDialogCompletionGesture(data);

               Log.i("Data", result);

           }

           

       });

    }


    @Override

    public void onClick(View v) {

    switch (v.getId()) {

    case R.id.face_login:

    doLogin();//在没有app的情况下进行网页授权

    break;

    case R.id.face_share:

    doShare();//在没有APP的情况下 不能分享

    break;

    case R.id.face_login_out:

    onClickLogout();

    break;


    default:

    break;

    }

    }


    private void doLogin(){

    // Session.openActiveSession(this, true, new StatusCallback() {

    // @Override

    // public void call(Session session, SessionState state, Exception exception) {

    // if(session.isOpened()){

    // // get token

    // Toast.makeText(FaceBookTest.this, session.getAccessToken(), Toast.LENGTH_SHORT).show();

    // }

    // }

    // });

     Session session = Session.getActiveSession();

           if (!session.isOpened() && !session.isClosed()) {

               session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));

           } else {

               Session.openActiveSession(this, true, statusCallback);

           }

    }

    private class SessionStatusCallback implements Session.StatusCallback {

           @Override

           public void call(Session session, SessionState state, Exception exception) {

           if(session.isOpened()){

    // get token

    Toast.makeText(FaceBookTest.this, session.getAccessToken(), Toast.LENGTH_SHORT).show();

    }

           }

       }

    private void onClickLogout() {

           Session session = Session.getActiveSession();

           if (!session.isClosed()) {

               session.closeAndClearTokenInformation();

           }

       }

    public void doShare(){

     

           try {  

               FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(this)  

                       .setLink("https://developers.facebook.com/android")  

                       .setApplicationName("AndroidBaiDuPush")  

                       .setDescription("description")  

                       .setName("name")  

                       .setCaption("caption")  

                       .setPlace("place")  

                       .setPicture("http://219.232.161.206:80/data/userdata/vismam/downfile/201307/01191850Ax44.jpeg")

                       .build();  

               uiHelper.trackPendingDialogCall(shareDialog.present());  

     

           } catch (FacebookException e) {  

               Toast.makeText(getApplication(), "Facebook app is not installed", Toast.LENGTH_SHORT).show();  

           } catch (Exception e) {  

               Toast.makeText(getApplication(), "Unexpect Exception", Toast.LENGTH_SHORT).show();  

           }  

       }

     @Override    

       public void onPause() {    

           super.onPause();    

           uiHelper.onPause();    

       }    

       

       @Override    

       public void onDestroy() {    

           super.onDestroy();    

           uiHelper.onDestroy();    

       }    

       

       @Override    

       public void onSaveInstanceState(Bundle outState) {    

           super.onSaveInstanceState(outState);    

           uiHelper.onSaveInstanceState(outState);    

       }    

         

       private Session.StatusCallback callback = new Session.StatusCallback() {    

           @Override    

           public void call(Session session, SessionState state,Exception exception) {  

               onSessionStateChange(session, state, exception);    

           }    

       };    

         

       private void onSessionStateChange(Session session, SessionState state,    

               Exception exception) {    

           if (state.isOpened()) {    

               Log.i("tag", "Logged in...");    

           } else if (state.isClosed()) {    

               Log.i("tag", "Logged out...");    

           }    

       } 

    }


    实现: 登录获取token 分享 退出

    doLogin();//在没有app的情况下进行网页授权

    doShare();//在没有APP的情况下 不能分享

    onClickLogout();


    app_key  需要在Strings 里面声明,直接卸载配置文件当中会找不到Key 报错!

    在运行代码的时候 前期一直不能成功,然后看提示语 发现都是hashKey的问题,此处需要多注意一下,这个hashKey和你得签名文件是有关联的,不同的eclispe或者打包工具对应不同的hashKey


    根据提示 很明白  是分享的dialog

    在.setApplicationName的时候 和注册APP的是不匹配的  自己去看申请是填写的名称 修改即可

    另外只回调初期 无论分享是成功还是取消都走onComplete 提示Success  后看源码和onComplete代码发现有data

    于是分别在取消分享和成功分享的时候查看data

    Ok此时就知道了

    String result = data.getString("com.facebook.platform.extra.COMPLETION_GESTURE");//cancel取消   post成功


    最后  注意一点的是  facebook的第三方库 要放在你得项目的同级磁盘下,不然导入库的时候会报错


    以上个人测试是通过的。如有大牛研究得更多的话,可留言告知!

    代码未整理 但应该可以明白

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • Facebook架构解读

    2018-05-17 17:12:05
    从我看过的各种资料,还有与各式人等的交谈中,可以得出Facebook现在的架构是这样的:Web前端用PHP语言编写,然后用HipHop Compiler[1]转换为C++语言,再用g++编译器编写,从而提供高性能的模板与web逻辑执行层。...
  • facebook

    2020-07-29 14:19:48
    NULL 博文链接:https://timerbin.iteye.com/blog/2029725
  • 第三方登陆实践之基于OAuth的FACEBOOK Web Login(最新版)Facebook 登录简介Facebook登陆实践1.首先,登陆[Facebook开发者平台](https://developers.facebook.com/)注册账号。2.然后,新建应用APP3.在应用APP中的...
  • 1为Facebook的“双子”数据中心;2为苹果未来数据中心的地点 据国外媒体报道,美国知名IT杂志《连线》日前通过航拍,拍摄到了苹果正在俄勒冈州普赖恩维尔建设的新数据中心。苹果的新数据中心地处俄勒冈高原荒漠,...
  • 最近有facebook入华的消息,各大科技媒体都有相关报道, 朋友圈也有相关内容转发,这说明这件事绝对是一个重磅消息。facebook虽然声名在外,可在中国大陆无法使用,...
  • 针对目前的Facebook新手用户来说的话,其实特别需要一款入门的书籍来介绍。Facebook的一些使用的方法。目前在国内来说,很少有专门的书籍来讲这一块,大部分的就是讲一些空洞的概念。以及市场的趋势,行业的环境。 ...
  • 最近项目需要集成Facebook的分享功能,在网上看了一些实现例子,用的方法感觉比较老了。Facebook最新的Api已经换了很多。下面我就将最新的集成方式分享给大家。 facebook官方提供的集成方式已经很清晰了,我们只是对...
  • 最近在接入facebook android sdk进行分享时,发现一个非常奇怪的现象,明明手机上已经安装了facebook客户端,但却经常出现无法调起客户端分享,而是调起了facebook sdk内置的网页分享。 在网页端分享时,用户又需要...
  • 最近因为买了vpn然后就玩了下facebook,我个人用的是流星加速器,反正网速挺好的,首先是说下登录吧 主要步骤有以下几步遇到很多坑,被那个key hash玩得不要不要的,我去,但是有古语说的好,坚持才能取得最后的...
  • 站外,听起来挺复杂,其实无外乎就是从和亚马逊这个巨头玩变成了和Google还有Facebook这两个巨头玩。就Google而言,与亚马逊的适配性其实并不大,玩的不好很容易水土不服。但是Facebook是能够直接和亚马逊形成连接的...
  • 首先,我们了解一下接入facebook的目的是什么: 我们进入facebook一般有两个目的,一个是查看app的下载量、次留、周留等数据;另一个是接入facebook登录sdk。 其中我只做过查看数据的这个sdk接入,今天我们要说的...
  • 现在的项目需求,增加了在Facebook上的分享。由于我们应用集成的是Facebook自身的SDK。在集成的时候碰到了很多坑,克服了很多困难。 下面就我记着的坑,罗列一下,具体解决方式暂不提供。 1.Facebook的集成包括了...
  • 公司项目主要做海外市场,并且是资讯类的产品,所以接入一些广告公司的广告是一项不错的创收,昨天下午产品告诉我要马上接入Facebook的原生广告需求,于是下午就开始阅读Facebook广告接入的官方开发文档进行接入测试...
  • facebook批量加好友

    2019-02-26 17:10:22
    facebook批量加人,最直接的方式就是利用facebook的推荐系统来加人。 但是这个影响的因素非常多。 所以需要进行一些筛选,判断,再来进行添加。就像我们人工加的好友质量绝对是最好的。 因为我们会有一个判断在里面...
1 2 3 4 5 ... 20
收藏数 213,730
精华内容 85,492
关键字:

facebook