2017-05-05 29 views
0

我想在android上上传到S3。但是,它实际上并没有上传图片。一如当年我看到一个错误的唯一事情是这样的:在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 
     ); 
    } 
} 

我已经验证该文件不为空。并且还验证它是正确的身份池ID。

这里有什么突出的缺失?

回答

0

事实证明,这个问题不能从上面的代码派生。我给出的“错误”是无关的,只是意味着cognito服务以前没有为该设备建立用户标识。然而,问题是,上面调用的函数将图像保存到S3被从uithread中调用,并且由于网络活动不能在UI线程上发生,所以它不会发出呼叫。我在尝试输出credentialsProvider.getProviderId()后发现这一点,并收到了一个错误。