2017-04-12 3 views
6

Ich habe ein Problem mit einer Android-Anwendung, die ich schreibe. Wir speichern einige Fotos in unserem Amazon S3-Bucket, und wenn ich versuche, über die App darauf zuzugreifen, werden die Callbacks in meinem TransferListener nie aufgerufen.Amazon S3 TransferListener wird nie aufgerufen

// 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); 
     } 
    }); 
} 

Die Datei läuft gut, nichts stürzt ab. Die Anwendung ruft jedoch niemals die Funktionen onStateChanged oder onError im TransferListener auf und ich erhalte meine Daten nie von S3. Kann jemand erklären warum und wie man es repariert?

Vielen Dank!

+0

haben Sie versucht, die S3 TransferUtility Probe mit auf https://github.com/awslabs/aws-sdk -android-Proben? Dieses Beispiel macht, was Sie versuchen zu erreichen –

+0

Ich habe ein paar Beispiel-Apps verwendet, einschließlich der oben genannten. Das Problem, das ich habe, ist, dass die Callback-Funktionen onStateChanged(), onProgressChanged() und onError() nicht in dieser bestimmten Anwendung aufgerufen werden, obwohl sie in anderen Anwendungen sind. – ellman121

+0

Können Sie Ihre AndroidManifest.xml veröffentlichen und überprüfen, ob Sie es in -Tag oder nicht – Ravi

Antwort

1

Ich hatte das gleiche Problem. Ich habe viel Zeit mit der Suche nach Lösungen verbracht, aber alle Lösungen sind nicht gut. Ich meine, dass Sie ein Problem mit dem Hochladen von großen Bildern haben werden.

Also, versuchen Sie das Problem von „multi Datei-Upload“ zu lösen wie https://dzone.com/articles/amazon-s3-parallel-multipart

Es funktioniert für mich. Es löst auch das Hochladen großer Bilder auf.

4

Ich hoffe, Sie haben Registrierungsdienst in Manifest, wenn Sie don t tn bitte in Manifest hinzufügen. Stellen Sie sicher, dass Ihre POOL_ID und Region korrekt ist.

Ich schlage vor, Sie PoolID und Region zu überprüfen, weil meistens Problem von dort auftritt,

Werfen Sie einen Blick auf folgenden Code-Dateien von s3-Server zum Download bereit. Vergleichen Sie mit Ihren.

Abhängigkeiten:

//aws 
compile 'com.amazonaws:aws-android-sdk-core:2.2.+' 
compile 'com.amazonaws:aws-android-sdk-s3:2.2.+' 

Ihre S3-Provider Anwendungsklasse hinzufügen, müssen nicht zu jeder Zeit zu schreiben.

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> 

Hier habe ich erstellt util herunterladen Anruf zu tätigen,

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(); 
       } 
      }); 
     } 
    } 

Nun rufen util wie unten herunterladen,

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

Hoffnung das wird Ihnen helfen ..

+0

.. Das dritte Mal implementieren s3, aber ich vergesse immer noch diese Linie in Manifest, vielen Dank! –

Verwandte Themen