我一直在使用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。
我給了那一槍。不幸的是,這並沒有解決問題。 –
請提供完整的代碼嗎?我的代碼在這裏沒有看到任何錯誤。如果示例應用程序正常工作,我認爲您可能無法正確配置您的應用程序使用傳輸實用程序。 – Yangfan