android - 无法在 Android 中将 Facebook 原生应用程序与 Gigya Social Login 一起使用
问题描述
我很难将 Facebook 原生与 Gigya 社交登录集成。如果他们通过浏览器继续,我已经能够对用户进行身份验证。
我正在使用类似于 Gigya 文档中提供的示例应用程序的代码。
我尝试用我的密钥和 ID 替换示例应用程序上的 API 密钥和应用程序 ID,并且当我使用 Facebook 原生应用程序时,presentNativeLogin()
我已经排除了它是我的 Facebook 应用程序 ID。
应用级 build.gradle 文件
//Gigya
implementation files('src/main/java/com/example/myproj/libs/gigya-android-sdk-4.0.1.aar')
//Facebook
implementation 'com.facebook.android:facebook-android-sdk:4.41.0'
//Google Sign In
implementation 'com.google.android.gms:play-services-auth:16.0.1'
显现
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="MY APP ID" />
<meta-data
android:name="apiKey"
android:value="MY API KEY" />
<meta-data
android:name="apiDomain"
android:value="MY DOMAIN"/>
<meta-data
android:name="googleClientId"
android:value="MY CLIENT ID" />
<activity
android:name="com.gigya.android.sdk.ui.HostActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name="com.gigya.android.sdk.ui.WebLoginActivity"
android:allowTaskReparenting="true"
android:launchMode="singleTask"
android:theme="@style/Theme.AppCompat.Translucent">
<intent-filter android:label="web_login_redirect">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="gsapi"
android:pathPrefix="/com.example.myproj/login_result"
android:scheme="gigya" />
</intent-filter>
</activity>
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
tools:replace="android:theme" />
onCreate 在我的应用程序类上
public void onCreate() {
super.onCreate();
//Gigya Implementation
// Allow WebViews debugging.
WebView.setWebContentsDebuggingEnabled(true);
// Enable Gigya logs in debug mode.
GigyaLogger.setDebugMode(true);
// Crucial. Call before first instantiation of the SDK.
Gigya.setApplication(this);
Gigya.getInstance(MyAccount.class);
}
进程登录
private val gigya: Gigya<MyAccount> = getInstance(MyAccount::class.java)
fun processGigyaLogin(loginProvider: String) {
val providers = listOf(FACEBOOK, GOOGLE)
gigya.socialLoginWith(providers, HashMap<String, Any>(), object : GigyaLoginCallback<MyAccount>() {
override fun onSuccess(obj: MyAccount) {
// Success
Log.i("GIGYA-CDC", "Logged in using" + obj.socialProviders + " as: " + obj.profile!!.firstName + " " + obj.profile!!.lastName + ", " + obj.profile!!.email)
}
override fun onConflictingAccounts(response: GigyaApiResponse, resolver: ILinkAccountsResolver) {
Log.d("GIGYA-CDC", "onConflictingAccounts")
resolver.linkToSocial(resolver.conflictingAccounts.loginProviders[0])
}
override fun onPendingRegistration(response: GigyaApiResponse, resolver: IPendingRegistrationResolver) {
Log.d("GIGYA-CDC", "onPendingRegistration")
}
override fun onError(error: GigyaError) {
Log.e("GIGYA-CDC", error.localizedMessage + " Status Code: " + error.statusCode + " Error Code: " + error.errorCode)
}
})
}
我也尝试在 Java 代码中执行此操作并得到相同的结果。所以我目前的问题是示例应用程序可以使用我的键,但是当我尝试实现相同的代码时它不起作用。
解决方案
我找到了解决办法。您需要使用strings.xml
来定义您的应用程序 ID,否则它不会打开 Facebook 应用程序。在此之前,我对其进行了硬编码,因为最终我需要使用 gradle.properties 来隐藏字符串。这给我带来了一个新问题,因为现在我需要从strings.xml
.
所以从:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="myIdHere" />
它变成了:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
需要明确的是,文档中提到建议将其放在strings.xml
文件中,但从未说过它是必需的。
推荐阅读
- java - 编程游戏中的 Java 循环
- mongodb - 在 MongoDB Atlas 上将共享主机的 IP 地址列入白名单
- flutter - 小部件内的Flutter FOR循环
- istio - 检查 istio 安装的选项值
- java - Cloud Native Buildpacks/Paketo with Java/Spring Boot:如何配置不同的 JDK 下载 uri(例如无法访问 github.com)
- java - 如何让我的数组以相反的顺序返回?
- java - Appdynamics 代理连接导致 Java 应用程序中的内存泄漏
- php - 从头开始创建站点地图插件
- java - 我们如何使用 JPA 和 Hibernate 设置 Read Uncommitted 隔离级别?
- c++ - 在我使用 shared_ptr 之后,什么是“在抛出 'std::bad_weak_ptr' 的实例后调用终止”