2017-10-05 10 views
2

J'ai vraiment essayé tous les liens avant de demander ici. Je ne sais pas quoi faire, j'ai tout googlé et essayé de nombreuses façons différentes et rien ne fonctionne. Je pense que le problème se situe dans le chemin de la chaîne de fichiers. Voici mon code principal:Télécharger des images de la galerie à S3 AWS android

package com.android.dji.eaglei; 

import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.amazonaws.auth.CognitoCachingCredentialsProvider; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferState; 
import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility; 
import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3Client; 
import com.amazonaws.services.s3.model.Tag; 

import java.io.File; 

public class MainActivity extends AppCompatActivity { 

    //for image upload 
    private ImageView imageView; 
    private Button button; 
    private static final int PICK_IMAGE = 1; 
    private Uri imageUri; 
    String imageName = "newTest.jpg"; 
    private Button upload; 
    // 

    // for aws 
    String bucket = "eagleibucket"; 
    File fileToUpload ; 
    AmazonS3 s3; 
    TransferUtility transferUtility; 
    // 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // callback method to call credentialsProvider method. 
     credentialsProvider(); 
     // callback method to call the setTransferUtility method 
     setTransferUtility(); 

     //uploading image 
     imageView = (ImageView) findViewById(R.id.imageView); 
     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       openGallery(); 
      } 
     }); 
     upload = (Button) findViewById(R.id.upload); 
     upload.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       setTransferUtility(); 
       setFileToUpload(v); 
      } 
     }); 
    } 
    protected void openGallery(){ 
     Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(gallery,PICK_IMAGE); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     try { 
      if (resultCode == RESULT_OK && requestCode == PICK_IMAGE) { 
       imageUri = data.getData(); 
       imageView.setImageURI(imageUri); 
       // aws uri img to upload 
       imageName = (String) imageView.getTag(); 
       imageUri = data.getData(); 
       imageView.setImageURI(imageUri); 




      } else { 
       Toast.makeText(this, "You haven't picked an image", Toast.LENGTH_LONG).show(); 
      } 
     } catch (Exception e) { 
      Toast.makeText(this, "Something went wrong!", Toast.LENGTH_LONG).show(); 
     } 
    } 
    public void credentialsProvider(){ 

     // Initialize the Amazon Cognito credentials provider 
     CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
       getApplicationContext(), 
       "us-west-2:edb44a70-b31e-44b0-b8c7-2d38a9c7c98f", // Identity pool ID 
       Regions.US_WEST_2 // Region 
     ); 
     setAmazonS3Client(credentialsProvider); 
    } 
    /** 
    * Create a AmazonS3Client constructor and pass the credentialsProvider. 
    * @param credentialsProvider 
    */ 
    public void setAmazonS3Client(CognitoCachingCredentialsProvider credentialsProvider){ 
     // Create an S3 client 
     s3 = new AmazonS3Client(credentialsProvider); 
     // Set the region of your S3 bucket 
     s3.setRegion(Region.getRegion(Regions.US_WEST_2)); 
    } 
    public void setTransferUtility(){ 
     transferUtility = new TransferUtility(s3, getApplicationContext()); 
    } 
    /** 
    * This method is used to upload the file to S3 by using TransferUtility class 
    * @param view 
    */ 
    public void setFileToUpload(View view){ 
     fileToUpload = new File(getRealPathFromURI(imageUri)); 
     if (fileToUpload == null) { 
      Toast.makeText(this, "Could not find the filepath of the selected file", Toast.LENGTH_LONG).show(); 
        // to make sure that file is not emapty or null 
      return; 
     } 
     TransferObserver transferObserver = transferUtility.upload(
       bucket, 
       imageName, 
       fileToUpload 
     ); 
     transferObserverListener(transferObserver); 
    } 
    /** 
    * This is listener method of the TransferObserver 
    * Within this listener method, we get status of uploading and downloading file, 
    * to display percentage of the part of file to be uploaded or downloaded to S3 
    * It displays an error, when there is a problem in uploading or downloading file to or from S3. 
    * @param transferObserver 
    */ 
    public void transferObserverListener(TransferObserver transferObserver){ 
     transferObserver.setTransferListener(new TransferListener(){ 
      @Override 
      public void onStateChanged(int id, TransferState state) { 
       Toast.makeText(getApplicationContext(), "State Change" + state, 
         Toast.LENGTH_SHORT).show(); 
      } 
      @Override 
      public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { 
       int percentage = (int) (bytesCurrent/bytesTotal * 100); 
       Toast.makeText(getApplicationContext(), "Progress in %" + percentage, 
         Toast.LENGTH_SHORT).show(); 
      } 
      @Override 
      public void onError(int id, Exception ex) { 
       Log.e("error","error"); 
      } 
     }); 
    } 
    private String getRealPathFromURI(Uri contentURI) { 
     String thePath = "no-path-found"; 
     String[] filePathColumn = {MediaStore.Images.Media.DISPLAY_NAME}; 
     Cursor cursor = getContentResolver().query(contentURI, filePathColumn, null, null, null); 
     if(cursor.moveToFirst()){ 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      thePath = cursor.getString(columnIndex); 
     } 
     cursor.close(); 
     return thePath; 
    } 
} 

Manifeste: J'ai ajouté les permissions ainsi que le service. J'ai également ajouté les bibliothèques nécessaires.

C'est l'erreur:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.android.dji.eaglei, PID: 
     java.lang.IllegalArgumentException: Invalid file: 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:478) 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:443) 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:412) 
      at com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility.upload(TransferUtility.java:353) 
      at com.android.dji.eaglei.MainActivity.setFileToUpload(MainActivity.java:134) 
      at com.android.dji.eaglei.MainActivity$2.onClick(MainActivity.java:70) 
      at android.view.View.performClick(View.java:5716) 
      at android.widget.TextView.performClick(TextView.java:10926) 
      at android.view.View$PerformClick.run(View.java:22596) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:148) 
      at android.app.ActivityThread.main(ActivityThread.java:7331) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Merci pour l'aide!

+0

Pouvez-vous imprimer la valeur de retour de getRealPathFromURI et vérifier si le fichier existe à partir de ce chemin? Quelle version d'AWS Android SDK utilisez-vous? – Karthikeyan

Répondre

0

Je pense que le chemin du fichier que vous avez essayé de télécharger était vide (car rien n'a été écrit près de l'erreur). essayez d'échanger fileToUpload avec le chemin du fichier, ou même le chemin d'un autre fichier, juste pour la vérification. lorsque vous y arriverez, vous pouvez essayer votre fichier et essayer de voir quelle est la valeur de fileToUpload dans "transferUtility.upload" au cours de l'exécution de l'application.