繁体   English   中英

在android上上传到s3存储桶时出错

[英]Error uploading to s3 bucket on android

我想在android上上传到S3。 但是,它实际上并不上传图像。 我看到的唯一类似于错误的是:

D / CognitoCachingCredentialsProvider:在SharedPreferences中找不到有效凭据

然而,当谷歌搜索它时,我发现各种相互矛盾的信息。 我能找到的唯一真实的事情是,这可能是因为没有正确地将cognito框架添加到项目中,但我已经验证它是在build.gradle中。

我还应该注意到,我在iOS上使用相同的凭据就可以了。 有人提到我需要为每个平台使用不同的身份池。 所以我为Android创建了一个新的身份池,并确保我有匹配的权限,但它也没有用。 考虑到iOS如何正常工作并上传图像没有问题,我觉得必须使用Android上的代码。 我把它包括在下面。

有这个功能从cognito获取凭据

    private CognitoCachingCredentialsProvider getCreadentials(Context context) {
    CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                    context.getApplicationContext(),
                    IDENTITY_POOL_ID,
                    Regions.US_EAST_1
            );

    return credentialsProvider;
}

然后实际将图像保存到S3的功能

    public void saveImage(Context context, Bitmap data, String key, Double lat, Double lon) {

    exifBuilder = new ExifBuilder(mContext, lat, lon);

    File file = writeImageToFile(context, data);
    s3 = new AmazonS3Client(getCreadentials(context));

    if (file != null) {

        TransferUtility transferUtility = new TransferUtility(s3, context.getApplicationContext());
        TransferObserver observer = transferUtility.upload(
                BUCKET_NAME,
                key,
                file
        );
    }
}

我已经验证该文件不为null。 并且还验证了它是正确的标识池ID。

这里有什么突出的缺失吗?

事实证明,这个问题不能从上面的代码中得出。 我给出的“错误”是无关的,只是意味着认知服务之前没有为该设备建立用户ID。 但问题是,上面调用的将图像保存到S3的函数是从uithread调用的,并且由于网络活动不能在UI线程上发生,因此它没有进行调用。 在尝试输出credentialsProvider.getProviderId()并收到错误后我想出了这个。

我看到这个问题并且上传没有完成,错误或成功标志。

在我的情况下,这是因为我没有在清单中声明TransferService

    <service
        android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
        android:enabled="true"/>

这可以防止上传发生,并且侦听器永远不会收到通知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM