1

我一直在使用AWS Mobile SDK version 2.2.15遇到問題。在仔細查看他們自己的S3TransferUtilitySample之後,我做了幾次嘗試將文件上傳到我自己的Amazon S3存儲桶。

我的第一個嘗試是嘗試從Android自己的AsyncTask中,在doInBackground()方法中調用TransferUtility的.upload()方法。在那裏沒有成功,並且在reading about this issue之後,它激勵我嘗試將AsyncTask之外的SDK調用移動到onPostExecute()下的UI線程中,懷疑調用本身是異步的,並且AsyncTask正在AWS SDK對象上運行垃圾回收。仍然沒有運氣,沒有例外被拋出,沒有任何跡象表明除了文件沒有實際上傳外,任何問題。

我的第二次嘗試是關注this exact example。我下載了源代碼,並能夠爲應用程序提供正確的身份池ID,區域,存儲桶,密鑰和測試jpeg文件。我運行了應用程序,並且正在進行呼叫。該文件在沒有任何問題的情況下進入了AWS S3。

我將它們的確切方法複製到我的應用程序的助手類中,並使所有AWS SDK對象成爲該類的靜態字段,但我仍遇到沒有引發異常的相同問題。我最終將這些字段設置爲非靜態的,並在我的主要活動中將helper類實例化爲一個對象,並安全地假定該對象不會被垃圾回收處理。依然沒有!沒有跡象表明這些電話失敗!

我決定真正慷慨的使用日誌Android的Log.i()方法,看的每一步,它甚至因此導致的TransferUtility的.upload()方法,但即使具有TransferListener設置和充分的記錄行,有沒有狀態變化,onError()沒有被調用。 TransferUtility的.upload()及其生成的TransferObserver對象不報告它正在運行測試應用程序。

這裏有幾個注意事項:
*正在這裏使用了正確的身份池ID,與
沒有問題*我一直在使用這兩個版本2.2.15嘗試以及2.2.13
*包含的所有依賴項都是.jar文件,該項目不是Gradle(尚未)
*服務在清單中聲明,就像它在示例中一樣
*沒有構建錯誤,Android Studio構建項目就好了
* TransferListener對象未觸發onStateChanged(),onProgressChanged()onError()

有沒有人遇到AWS S3 SDK這樣一個奇怪的問題?有關如何更好地調試此問題的任何建議?

亞馬遜的AWS Mobile SDK for Android及其S3上傳工具不報告任何錯誤,爲什麼?

這裏的類現在:

public class AmazonS3Helper 
{ 
    Context context; 

    public String bucket; 
    public String key; 

    public File file; 

    public AmazonS3 s3; 
    public TransferUtility utility; 

    public AmazonS3Helper(JSONObject p, Context c) 
    { 
     Log.i("tag", "new AmazonS3Helper object"); 

     this.context = c; 

     try 
     { 
      bucket = p.getString("bucket"); 
      key  = p.getString("key"); 


      this.file = new File(
       c.getExternalFilesDir(null), 
       "nn_temp_photo.jpg"); 

      credentialsProvider(); 
      setTransferUtility(); 

      upload(); 
     } 
     catch (Exception x) 
     { 
      Log.i("tag", "Error in new AmazonS3Helper object: " + x.getMessage()); 
     } 
    } 

    public void credentialsProvider() 
    { 
     Log.i("tag", "Providing credentials"); 

     try 
     { 
      CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
       this.context, 
       // This has been verified to return the correct identity pool 
       MyApplicationClass.getPreference("aws.credentials"), 
       Regions.US_EAST_1); 

      setAmazonS3Client(credentialsProvider); 
     } 
     catch (Exception x) 
     { 
      Log.i("tag", "Error in providing credentials: " + x.getMessage()); 
     } 
    } 

    public void setAmazonS3Client(CognitoCachingCredentialsProvider credentialsProvider) 
    { 
     Log.i("tag", "Setting amazon s3 client"); 

     try 
     { 
      s3 = new AmazonS3Client(credentialsProvider); 
      s3.setRegion(Region.getRegion(Regions.US_EAST_1)); 
     } 
     catch (Exception x) 
     { 
      Log.i("tag", "Error in setting amazon s3 client:" + x.getMessage()); 
     } 
    } 

    public void setTransferUtility() 
    { 
     Log.i("tag", "Setting transfer utility"); 

     try 
     { 
      utility = 
       new TransferUtility(
        s3, 
        this.context); 
     } 
     catch (Exception x) 
     { 
      Log.i("tag", "Error in setting transfer utility: " + x.getMessage()); 
     } 
    } 

    public void upload() 
    { 
     Log.i("tag", "uploading"); 

     try 
     { 
      TransferObserver transferObserver = utility.upload(
       bucket, 
       key, 
       file 
      ); 

      transferObserverListener(transferObserver); 
     } 
     catch (Exception x) 
     { 
      Log.i("tag", "Error in uploading: " + x.getMessage()); 
     } 
    } 

    public void transferObserverListener(TransferObserver transferObserver) 
    { 
     Log.i("tag", "transferObserverListener"); 

     try 
     { 
      transferObserver.setTransferListener(new TransferListener() 
      { 
       @Override 
       public void onStateChanged(int id, TransferState state) 
       { 
        Log.i("tag", state + ""); 
       } 

       @Override 
       public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) 
       { 
        int percentage = (int) (bytesCurrent/bytesTotal * 100); 
        Log.i("tag", percentage + ""); 
       } 

       @Override 
       public void onError(int id, Exception ex) 
       { 
        Log.i("tag", "error"); 
       } 
      }); 
     } 
     catch (Exception x) 
     { 
      Log.i("tag", "Error in transferObserverListener: " + x.getMessage()); 
     } 
    } 
} 


編輯

我忘了提,但這個被測試的Android版本是Android的棒棒糖5.1。

回答

1

這是2.2.15中的一個錯誤。一些IO異常不會被報告。它在2.2.16中被修復。你可以試試最新版本嗎?

+0

我給了那一槍。不幸的是,這並沒有解決問題。 –

+0

請提供完整的代碼嗎?我的代碼在這裏沒有看到任何錯誤。如果示例應用程序正常工作,我認爲您可能無法正確配置您的應用程序使用傳輸實用程序。 – Yangfan

1

該問題已解決,與代碼本身完全無關。發生了什麼事情是我在庫的聲明中聲明瞭com.amazonaws.mobileconnectors.s3.transferutility.TransferService,但子應用程序也需要它的清單。

我通過將示例活動直接放入我的應用程序中發現了這一點,並且實現了子應用程序也需要此活動聲明。子應用程序本身沒有代碼,但沒有聲明在自己的清單中,他們不知道被引用的活動/服務存在。在這種情況下,亞馬遜默默拒絕上傳,因爲該服務未針對特定應用程序進行聲明。