回答下面的評論:Gigya - Notify I've logged wih Facebook的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());
然後在我的LoginGigyaWebViewFragment
我加載一個WebView
一個URL,其中是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 userId或Facebook電子郵件手動登錄Gigya,但我不知道該怎麼做。
有什麼建議嗎?
對不起,缺少代碼。我從一開始就更新了它。 –
奧斯卡,不幸的是,你不能在Gigya SDK的頂部添加本地登錄。按照上述鏈接中的說明安裝Gigya SDK和Facebook SDK; Facebook本地登錄直接添加到Gigya登錄中,所以當用戶點擊Facebook鏈接時,它們會自動定向到本地登錄 - 並且無需任何額外的努力即可啓動Gigya會話(登錄成功後)。試圖以任何其他方式實現這一點不被支持,爲了支持本地登錄,它必須在構建時在Gigya SDK內進行配置。 – Levi
啊,好的。瞭解。所以我想我的下一個任務是考慮如何在我使用Facebook登錄時自動更改登錄屏幕以及如何訪問Gigya數據。非常感謝你! –