Kotlin中的AWS Drop-In Auth变成空白

时间:2019-09-13 04:39:20

标签: android kotlin amazon-cognito aws-amplify aws-appsync

我正在尝试在Kotlin Android应用程序中使用AWS Cognito的嵌入式身份验证(SignInUI),并在登录时将其重定向到我的MainActivity,但它拉起了一个空白屏幕:enter image description here

我使用放大功能,使用默认设置来创建认知池。

SignInActivity

class SignInActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sign_in)

        AWSMobileClient.getInstance().initialize(applicationContext, object : Callback<UserStateDetails>{
            override fun onResult(result: UserStateDetails?) {
                Logger.d(result?.userState)
                when (result?.userState) {
                    UserState.SIGNED_IN -> {
                        val i = Intent(applicationContext, MainActivity::class.java)
                        startActivity(i)
                    }
                    UserState.SIGNED_OUT -> showSignIn()
                    else -> {
                        AWSMobileClient.getInstance().signOut()
                        showSignIn()
                    }
                }
            }

            override fun onError(e: Exception?) {
                Logger.e(e!!.localizedMessage)
            }

        })
    }

    private fun showSignIn() {
                AWSMobileClient.getInstance().showSignIn(this@SignInActivity,
                    SignInUIOptions.builder().nextActivity(MainActivity::class.java).build())
    }
}

我尝试了showSignIn()函数的其他两个版本:

    private fun showSignIn() {
        AWSMobileClient.getInstance().initialize(this) {
            val config = AuthUIConfiguration.Builder()
                .userPools(true)
                .backgroundColor(Color.BLUE)
                .canCancel(true)
                .build()
            val signInUI = AWSMobileClient.getInstance().getClient(this@SignInActivity, SignInUI::class.java) as SignInUI
            signInUI.login(this@SignInActivity, MainActivity::class.java).authUIConfiguration(config).execute()
        }.execute()
    }
}

private fun showSignIn() {
    AWSMobileClient.getInstance().initialize(this) {
        val ui = AWSMobileClient.getInstance().getClient(
            this@SignInActivity,
            SignInUI::class.java) as SignInUI?
        ui?.login(
            this@SignInActivity,
            MainActivity::class.java)?.execute()
    }.execute()   
}

我的 awsconfiguration.json

{
    "UserAgent": "aws-amplify-cli/0.1.0",
    "Version": "1.0",
    "IdentityManager": {
        "Default": {}
    },
    "AppSync": {
        "Default": {
            "ApiUrl": "https://[redacted].appsync-api.us-west-2.amazonaws.com/graphql",
            "Region": "us-west-2",
            "AuthMode": "AMAZON_COGNITO_USER_POOLS"
        }
    },
    "CredentialsProvider": {
        "CognitoIdentity": {
            "Default": {
                "PoolId": "[redacted]",
                "Region": "us-west-2"
            }
        }
    },
    "CognitoUserPool": {
        "Default": {
            "PoolId": "[redacted]",
            "AppClientId": "[redacted]",
            "AppClientSecret": "[redacted]",
            "Region": "us-west-2"
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我有类似的问题。也许这会帮助某人。

使用Android Studio,我创建了一个空活动,该活动用于调用登录代码,并将该活动类命名为“ SignInActivity”。 Android Studio自动创建了其他一些文件,例如布局文件。现在来了有趣的部分。 Android Studio为我的空活动创建了布局文件,将其放置在“ src \ main \ res \ layout \”目录中,并将其命名为“ activity_sign_in.xml”,巧合的是,它与aws-android-sdk-在我的情况下位于此处的auth-ui-2.16.9库“ .gradle / caches / transforms-2 / files-2.1 / 5ee42e7f988d8fd14d66f8143c5901b8 / jetified-aws-android-sdk-auth-ui-2.16.9 / res / layout / activity_sign_in.xml“

现在,当com.amazonaws.mobile.auth.ui.SignInActivity启动时,它将调用setContentView(R.layout.activity_sign_in);。就我而言,这已加载了我的空活动的布局,而不是aws-android-sdk-auth-ui-2.16.9 lib中提供的布局。

解决方案是将我的布局xml文件的名称更改为与activity_sign_in.xml不同的名称。

看看您的代码,这也应该对您有用。

答案 1 :(得分:0)

您是否尝试过有关身份验证的快速入门指南:https://aws-amplify.github.io/docs/android/authentication#drop-in-auth

最近,当我在一个新的Android项目中尝试使用此简单版本时,它对我有用:

AWSMobileClient.getInstance().showSignIn(this, new Callback<UserStateDetails>() {
@Override
public void onResult(UserStateDetails result) {
    Log.d(TAG, "onResult: " + result.getUserState());
}

@Override
public void onError(Exception e) {
    Log.e(TAG, "onError: ", e);
}
});