我正在编写的一个Android应用程序遇到了一个问题。我们将一些照片存储在我们的亚马逊S3存储桶中,当我尝试从应用程序访问它们时,TransferListener中的回调函数从未被调用过。
// 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);
}
});
}文件运行正常,没有任何东西崩溃。但是,应用程序永远不会调用TransferListener中的onStateChanged或onError函数,因此我永远不会从S3收到数据。有人能解释一下为什么,以及如何修复它吗?
谢谢!
发布于 2017-04-20 21:18:10
更新
我已经创建了用于从s3上传和下载的RxJava实用程序。
希望这能对你有所帮助..
希望您在清单中有注册服务,如果您没有,请在清单中添加。确保您的POOL_ID和Region是正确的。
我建议你检查你的poolID和区域,因为大多数问题都是从那里发生的,
看看下面从s3服务器下载文件的代码。与你的比较。
依赖项:
//aws
compile 'com.amazonaws:aws-android-sdk-core:2.2.+'
compile 'com.amazonaws:aws-android-sdk-s3:2.2.+'将您的S3提供程序添加到应用程序类中,不需要每次都编写。
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和服务:
<application
android:name=".AppController"
.....
.....>
<service
android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
android:enabled="true" />
</application>在这里,我创建了util来进行下载调用,
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();
}
});
}
}现在只需调用util进行下载,如下所示:
String key = "yourKey";
String storageFilePath = "your_storage_location";
new S3DownloadUtil().download(key, new File(storageFilePath));发布于 2017-04-20 20:14:50
我也有同样的问题。我花了很多时间寻找解决方案,但并不是所有的解决方案都很好。我的意思是,你也会有一个上传大图片的问题。
所以,试着像https://dzone.com/articles/amazon-s3-parallel-multipart一样通过"MultiPart文件上传“来解决你的问题
这对我很管用。它还解决了上传大图片的问题。
https://stackoverflow.com/questions/43376351
复制相似问题