AWS Lambda在Android

时间:2019-06-05 10:15:43

标签: android amazon-web-services kotlin aws-lambda

我正在使用AWS Amplify在iOS和Android上构建应用程序。我有一个lambda表达式,该表达式需要一个经度,一个纬度,一个用户名,一个对象ID,并返回一个布尔值,告诉我是或否用户在物理上接近该对象。

它可以完美地在我的iOS应用上运行,根据用户位置,我得到truefalse,但是在Android上,我总是得到null作为响应。

这是触发我的lambda的函数:

fun locationLambda() {
    if ( ContextCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) {
        fusedLocationClient.lastLocation.addOnSuccessListener { location : Location? ->
            if (location != null) {

                val latitude = location.latitude.toString()
                val longitude = location.longitude.toString()
                val username = AWSMobileClient.getInstance().username
                val objectId = (intent.extras.getSerializable("object") as Object).getId()

                Log.i("ObjectId", objectId)
                Log.i("Longitude", longitude)
                Log.i("Latitude", latitude)
                Log.i("Username", username)

                mAWSAppSyncClient?.query(IsObjectFoundQuery.builder()
                        .latitude(latitude)
                        .longitude(longitude)
                        .username(username)
                        .objectID(objectId)
                        .build())
                        ?.responseFetcher(AppSyncResponseFetchers.NETWORK_ONLY)
                        ?.enqueue(locationCallback)
            }
        }
    }
}

当我在日志中打印发送到lambda的参数一切正常时,将发送正确的值。

这是我的回调函数:

private val locationCallback = object : GraphQLCall.Callback<IsObjectFoundQuery.Data>() {
    override fun onResponse( response: com.apollographql.apollo.api.Response<IsObjectFoundQuery.Data>) {
        Log.i("Results", response.data()?.isObjectFound.toString())
    }

    override fun onFailure(e: ApolloException) {
        Log.e("ERROR", e.toString())
    }
}

我在这里成功获得了答复,但是response.data()?.isObjectFoundnull

我在这里做错什么了吗?还是必须去别的地方看看?

1 个答案:

答案 0 :(得分:1)

不登录就对lambda函数进行故障排除有点像在黑暗中寻找东西:这非常困难。您将需要在客户端和服务器端(也称为后端)进行日志记录,以便能够解决此问题。

对于后端日志记录,AWS为Lambda和API网关提供了Cloudwatch logs

因此,要检查您的lambda的Cloudwatch日志,请进入您的Lambda所在区域的AWS控制台,然后进入Cloudwatch服务。然后选择侧面的日志。您应该看到一个以Lambda函数命名的日志组。单击此选项将为您显示被调用时为lambda收集的诊断信息(有关示例,请参见下图)。展开并折叠日志行条目。 enter image description here

一旦确认您已打开cloudwatch日志,请遵循以下策略:

  1. 从IOS客户端运行测试调用,并确认客户端上的输出成功。然后检查您的IOS测试的cloudwatch日志(针对API网关和Lambda函数),并记录成功情况。

  2. 接下来,使用上面的代码从Android运行第二个测试。在cloudwatch中查找两者之间的区别,这应该可以揭示细节,以帮助您解决Android通话中出现的问题。

如果Amplify并未为您的API网关或Lambda函数创建Cloudwatch日志,请按照here步骤进行设置。希望这可以帮助您找到解决方案。