Вот курс прямо сейчас:
Изменить
Забыл упомянуть, но тестируется версия Android Lollipop 5.1.
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());
}
}
}
Это ошибка версии 2.2.15. О некоторых исключениях ввода-вывода не сообщается. Это исправлено в 2.2.16. Не могли бы вы попробовать последнюю версию?
Моя первая попытка состояла в том, чтобы попытаться вызвать метод TransferUtility _1_ из собственной AsyncTask Android, внутри метода _2_. Безуспешно, и после чтения об этой проблеме я вдохновился попробуйте переместить вызовы SDK за пределы AsyncTask и в поток пользовательского интерфейса под _3_, подозревая, что сам вызов является асинхронным, а AsyncTask выполняет сборку мусора для объектов AWS SDK. По-прежнему не повезло, никаких исключений не выдается, и нет признаков того, что что-то пойдет не так, за исключением того, что файл на самом деле не загружается.
Моя вторая попытка заключалась в следующем: этот пример. Я загрузил исходный код и смог предоставить приложению правильный идентификатор пула удостоверений, регион, сегмент, ключ и тестовый файл jpeg. Я запустил приложение, и звонки были сделаны. Файл попал в AWS S3 без каких-либо проблем.
Я скопировал их точные методы во вспомогательный класс своего приложения и сделал все объекты AWS SDK статическим полем класса, но я все еще работаю в ту же проблему, что исключения не выбрасываются. В итоге я сделал поля нестатическими и создал вспомогательный класс как объект в своей основной деятельности, с уверенностью предполагая, что объект не будет обрабатываться сборкой мусора. Еще ничего! Никаких признаков сбоя в этих вызовах!
Я решил быть очень щедрым на ведение журнала с использованием метода _4_ Android, наблюдая за каждым шагом, и он даже доходит до метода TransferUtility _5_, но даже имея TransferListener установлен и полон строк логирования, изменения статуса нет, _6_ не вызывается. _7_ TransferUtility и полученный в результате объект TransferObserver не сообщают ничего, похожего на запуск тестового приложения.
Вот несколько замечаний:
* Здесь используется правильный идентификатор пула удостоверений, никаких проблем с этим
* Я пытался использовать как версию 2.2.15, так и 2.2.13
* Все включенные зависимости являются файлами .jar, проект не Gradle (пока)
* Служба объявлена в манифест точно такой же, как в примерах
* Ошибок сборки нет, Android Studio отлично строит проект
* Объект TransferListener не запускает _8_, _9_ или _10_
Есть кто-нибудь сталкивался с такой странной проблемой с AWS S3 SDK? Любые предложения о том, как лучше отладить эту проблему?
16.05.2016