2017-04-12 37 views
6

我遇到了一个我正在编写的Android应用程序的问题。我们在我们的Amazon S3存储桶中存储了一些照片,当我尝试从应用中访问它们时,我的TransferListener中的回调永远不会被调用。Amazon 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接收数据。有人可以解释为什么,以及如何解决它?

谢谢!

+0

你试图使用S3 TransferUtility样品上https://github.com/awslabs/aws-sdk -android-samples? 此示例执行您要完成的任务 –

+0

我已经使用了一些示例应用程序,其中包括上述应用程序。我遇到的问题是OnCrogressChanged()和onError()的回调函数在这个特定的应用程序中没有被调用,尽管它们在其他应用程序中。 – ellman121

+0

您可以发布您的AndroidManifest.xml并检查您是否声明<服务 android:name =“com.amazonaws.mobileconnectors.s3.transferutility。TransferService” 机器人:启用=‘真’/>它标签或不 – Ravi

回答

1

我有同样的问题。我花了很多时间寻找解决方案,但所有解决方案都不好。我的意思是,你也会遇到上传大图片的问题。

所以,试图通过“多文件上传”之类https://dzone.com/articles/amazon-s3-parallel-multipart

它为我解决您的问题。它也解决了上传大图片的问题。

4

希望你已经在清单中注册服务,如果你不需要;请添加清单。确保你的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)); 

希望这将帮助你..

+0

。第三次实现s3,但我仍然忘记清单中的这一行,非常感谢! –

相关问题