2017-05-05 65 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()後發現這一點,並收到了一個錯誤。