2017-04-12 20 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

...これはあなたを助けることを願っています

String key = "yourKey"; String storageFilePath = "your_storage_location"; new S3DownloadUtil().download(key, new File(storageFilePath)); 

、以下のようにダウンロードするのutilを呼び出して試してみました - アンドロイド - サンプル? このサンプルは、あなたが達成しようとしていることを実行しています –

+0

私は上記のものを含むいくつかのサンプルアプリケーションを使用しました。私が抱えている問題は、コールバック関数onStateChanged()、onProgressChanged()、およびonError()が、この特定のアプリケーションで呼び出されていないことです。 – ellman121

+0

AndroidManifest.xmlを投稿して、 Ravi

答えて

1

私は同じ問題がありました。私は解決策を探すのに多くの時間を費やしましたが、すべての解決策は良くありません。私は大きな画像をアップロードすることにも問題があることを意味します。

だから、それは私の作品https://dzone.com/articles/amazon-s3-parallel-multipart

のように、「含むMultiPartファイルアップロード」で、あなたの問題を解決してみてください。アップロードされた大きな画像も解決します。

4

マニフェストに登録サービスをご希望の場合は、マニフェストに登録サービスをご利用ください。あなたのPOOL_IDと地域が正しいことを確認してください。

ほとんど問題は、そこから発生するので、私はあなたがあなたおよび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(); 
       } 
      }); 
     } 
    } 

は今、あなたはhttps://github.com/awslabs/aws-sdk上S3 TransferUtilityサンプルを使用してちょうど

+0

:「有効= アンドロイド』 TransferService。 3回目はs3を実装していますが、私はまだマニフェストでこの行を忘れています。 –

関連する問題