在下面的评论中回答: 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
加载WebView
Gigya 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,但我不知道该怎么做。
有什么建议吗?