我在使用AWS Mobile SDK version 2.2.15时遇到了问题。仔细查看他们自己的S3TransferUtilitySample之后,我做了几次尝试,将文件自己上传到Amazon S3存储桶。
我的第一次尝试是尝试从Android自己的.upload()
方法内部的AsyncTask中调用TransferUtility的doInBackground()
方法。在那里没有成功,在reading about this issue之后,它启发了我尝试将SDK调用移出AsyncTask之外,并移到onPostExecute()
下的UI线程中,因为怀疑调用本身是异步的并且AsyncTask在AWS上运行垃圾回收SDK对象。仍然没有运气,没有引发异常,除了没有真正上传的文件之外,没有任何错误的迹象。
我的第二次尝试是跟随this exact example。我下载了源代码,并能够为应用程序提供正确的标识池ID,区域,存储区,密钥和测试jpeg文件。我运行了应用程序,并且正在进行呼叫。该文件将其发送到AWS S3,没有任何问题。
我将它们的确切方法复制到应用程序的帮助程序类中,并使所有AWS开发工具包对象成为该类的静态字段,但是我仍然遇到同样的问题,没有引发任何异常。我最终使这些字段成为非静态字段,并在我的主要活动中将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这样奇怪的问题吗?关于如何更好地调试此问题的任何建议?
这是现在的课程:
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 Lollipop 5.1。
最佳答案
这是2.2.15中的错误。没有报告某些IO异常。在2.2.16中已修复。您可以尝试使用最新版本吗?