I'm having an issue with an Android application I am writing. We are storing some photos in our Amazon S3 bucket, and when I try to access them from the app, the callbacks in my TransferListener never get called.
// S3Networker.java singleton
static final String AWS_COGNITO_POOL_ID = "OUR ID IS HERE";
static final String AWS_BUCKET_NAME = "OUR BUCKET NAME";
TransferUtility transferUtility = null;
private S3Networker instance;
private S3Networker() {
CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
Application.getContext(),
AWS_COGNITO_POOL_ID,
Regions.US_WEST_2
);
AmazonS3Client s3Client = new AmazonS3Client(credentialsProvider);
transferUtility = new TransferUtility(s3Client,Application.getContext());
}
public getInstance() {
if(instance == null) {
instance = new S3Networker();
}
return instance;
}
// ...
// Some class methods that don't touch S3
// ...
// S3 Download Method
public void S3PhotoFetch() {
final String objectKey = "path/to/item.jpg";
final File fileDownload = new File(Application.getContext().getCacheDir(), objectKey);
TransferObserver transferObserver = transferUtility.download(
AWS_PHOTO_BUCKET_NAME,
objectKey,
fileDownload );
transferObserver.setTransferListener(new TransferListener(){
@Override
public void onStateChanged(int id, TransferState state) {
Log.d(TAG, "onStateChanged: " + state);
if (TransferState.COMPLETED.equals(state)) {
Log.d(TAG, "Download finished");
}
}
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { }
@Override
public void onError(int id, Exception ex) {
Log.e(TAG, "onError: ", ex);
}
});
}
The file runs fine, nothing is crashing. However, the application is never calling the onStateChanged or onError functions in the TransferListener, and I am subsequently never receiving my data from S3. Can somebody explain why, and how to fix it?
Thank you!
UPDATE
I have created RxJava utils for Upload and Download from s3.
RxAWSUploadUtil
RxAWSDownloadUtil
Hope this will help you..
Hope you have register service in manifest, if you don;t thn please add in Manifest. Make sure your POOL_ID and Region is currect.
I Suggest you to check your poolID and region because mostly problem occurs from there,
Have a look at below code to download files from s3 server. compare with yours.
dependencies :
//aws
compile 'com.amazonaws:aws-android-sdk-core:2.2.+'
compile 'com.amazonaws:aws-android-sdk-s3:2.2.+'
Add your S3 Provider to Application Class, don't need to write at every time.
AppController.class
public class AppController extends Application {
private static Context mContext;
private static CognitoCachingCredentialsProvider credentialsProvider;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(), /* get the context for the application */
"us-east-4658798797987", /* Identity Pool ID */
Regions.US_WEST_2 /* Region for your identity pool--US_WEST_2 or EU_WEST_2*/
);
}
public static Context getContext() {
return mContext;
}
public static CognitoCachingCredentialsProvider getCredentialProvider() {
return credentialsProvider;
}
}
AppController.class & service in Manifest :
<application
android:name=".AppController"
.....
.....>
<service
android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
android:enabled="true" />
</application>
Here I have created util to make download call,
public class S3DownloadUtil {
private AmazonS3Client mS3Client;
private TransferUtility transferUtility;
public S3DownloadUtil() {
mS3Client = new AmazonS3Client(AppController.getCredentialProvider());
transferUtility = new TransferUtility(mS3Client, AppController.getContext());
}
//download method
public void download(final String FILE_KEY, File downloadFile) {
final TransferObserver observer = transferUtility.download(
AWS_S3_BUCKET_NAME, /* The bucket to download from */
FILE_KEY, /* The key for the object to download */
downloadFile /* The file to download the object to */
);
observer.setTransferListener(new TransferListener() {
@Override
public void onStateChanged(int id, TransferState state) {
switch (state) {
case COMPLETED: {
transferUtility.deleteTransferRecord(id);
String resourceUrl = mS3Client.getResourceUrl(observer.getBucket(), FILE_KEY); // get resourceUrl
Log.d(TAG, "onStateChanged: " + state);
break;
}
case CANCELED: {
transferUtility.deleteTransferRecord(id);
String resourceUrl = mS3Client.getResourceUrl(observer.getBucket(), FILE_KEY); // get resourceUrl
Log.d(TAG, "onStateChanged: " + state);
break;
}
case FAILED: {
transferUtility.deleteTransferRecord(id);
String resourceUrl = mS3Client.getResourceUrl(observer.getBucket(), FILE_KEY); // get resourceUrl
Log.d(TAG, "onStateChanged: " + state);
break;
}
case PAUSED: {
break;
}
case WAITING_FOR_NETWORK: {
transferUtility.deleteTransferRecord(id);
String resourceUrl = mS3Client.getResourceUrl(observer.getBucket(), FILE_KEY); // get resourceUrl
Log.d(TAG, "onStateChanged: " + state);
break;
}
}
}
@Override
public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
}
@Override
public void onError(int id, Exception ex) {
ex.printStackTrace();
}
});
}
}
Now just call util to download as below,
String key = "yourKey";
String storageFilePath = "your_storage_location";
new S3DownloadUtil().download(key, new File(storageFilePath));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With