0

在下面的评论中回答: Gigya - 通知我已经登录 Facebook

我正在使用 Gigya 服务在我的客户端 Android 应用程序中提供社交登录。问题是 Facebook 必须是本地的,所以我编辑了一点数据流。

第一步:添加到我AndroidManifest.xml的 Gigya 和 Facebook 活动:

<activity
    android:name="com.gigya.socialize.android.ui.HostActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
    android:name="com.gigya.socialize.android.login.providers.WebLoginActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:launchMode="singleTask"
    android:allowTaskReparenting="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="com.company.appname" android:host="gsapi" />
    </intent-filter>
</activity>
<activity android:name="com.facebook.FacebookActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:label="@string/app_name" />
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="{myFacebookAppId}"/>

之后,在我MainActivity.java初始化 Gigya 中:

GSAPI.getInstance().initialize(MainActivity.this, gigyaApiKey, gigyaServer);
GSAPI.getInstance().setSocializeEventListener(new GigyaSocializeListener(MainActivity.this));
GSAPI.getInstance().setAccountsEventListener(new GigyaAccountsListener());

然后在我的一个 url 中LoginGigyaWebViewFragment加载WebViewGigya webView(电子邮件和密码EditText以及社交插件),拦截请求 url 并进行本机 Facebook 登录。

public class LoginGigyaWebViewFragment extends Fragment {

    private final static String TAG = LoginGigyaWebViewFragment.class.getSimpleName();

    private WebView webView;
    private CallbackManager callbackManager;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_login_gigya_webview, container, false);
        webView = (WebView) view.findViewById(R.id.login_gigya_webView);
        setupWebView();
        webView.loadUrl("http://www.mywebpagedomain.com/gigya/tablet.html");
        return view;
    }

    private void setupWebView() {
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(false);
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setSaveFormData(true);

        webView.setWebChromeClient(new WebChromeClient());

        webView.setWebViewClient(new WebViewClient() {            
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                Uri uri = Uri.parse(url);
                String provider = uri.getQueryParameter("x_provider");
                if (provider != null && !provider.isEmpty()) {
                    switch (provider) {
                        case "facebook":
                            webView.stopLoading();
                            makeFacebookStuff();
                            return false;
                        default:
                            return GSWebBridge.handleUrl(webView, url);
                    }
                }
                return false;
            }
        });
        GSWebBridge.attach(getActivity(), webView, new GSWebBridgeListener() {
            @Override
            public void beforeLogin(WebView webView, GSLoginRequest.LoginRequestType requestType, GSObject params) {
                Log.d(TAG, "beforeLogin");
            }

            @Override
            public void onLoginResponse(WebView webView, GSResponse response) {
                Log.d(TAG, "onLoginResponse");
            }

            @Override
            public void onPluginEvent(WebView webView, GSObject gsObject, String s) {
                Log.d(TAG, "onPluginEvent");
            }
        });
    }

    private void makeFacebookStuff() {
        FacebookSdk.sdkInitialize(this.getContext().getApplicationContext());
        FacebookSdk.setApplicationId(AppConfig.getInstance().getFacebookAppId());
        LoginManager.getInstance().setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK);
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d("Facebook", loginResult.toString());
            }

            @Override
            public void onCancel() {
                Log.d("Facebook", "onCancel");
            }

            @Override
            public void onError(FacebookException error) {
                Log.d("Facebook", error.toString());
            }
        });
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
    }

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

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (GSAPI.getInstance().handleAndroidPermissionsResult(requestCode, permissions, grantResults)) {
            return;
        }
    }
}

问题是即使 Facebook 登录成功,我也不知道如何通知 Gigya 发生的事情。我一直在考虑的另一个解决方案是使用 Facebook 用户 ID 或 Facebook 电子邮件手动登录 Gigya,但我不知道该怎么做。

有什么建议吗?

4

1 回答 1

0

支持 Facebook 原生登录。为了在 Gigya 中使用 Facebook 原生登录,您需要将 Facebook SDK for Android 作为依赖项安装到您的应用程序中并重新编译它。您可以在此处查看详细说明:http: //developers.gigya.com/display/GD/Android#Android-AddingFacebookNativeLogin

于 2017-05-03T14:00:32.840 回答