简体   繁体   中英

upload video from Android to AWS S3

I added the AWS Android SDK to my app and i have some code in an AsyncTask that should upload my video to my bucket but its not working.

Android code:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_VIDEO) {

            try {
Uri selectedImageUri = data.getData();
                File file = new File(String.valueOf(selectedImageUri));


                // Initialize the Amazon Cognito credentials provider
                CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                        getApplicationContext(),
                        "us-east-1:5bfc6b1a-6193-4fXc-823f-ba21a9fadc1b", // Identity Pool ID
                        Regions.US_EAST_1 // Region
                );

                // Create an S3 client
                AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
                // Set the region of your S3 bucket
                s3.setRegion(Region.getRegion(Regions.US_EAST_1));
                TransferUtility transferUtility = new TransferUtility(s3, SellerHomePage.this);

                TransferObserver observer = transferUtility.upload(
                        "willsapptest",
                        "plzWork",
                        file
                );


                observer.setTransferListener(new TransferListener() {
                    public void onStateChanged(int id, TransferState state) {
                        //check the state
                    }

                    @Override
                    public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {

                    }

                    public void onError(int id, Exception ex) {
                        Log.e("", "Error during upload: " + id, ex);
                    }
                });
        );
                }catch (Exception e){
                SevenSecVideoName = (TextView) findViewById(R.id.SevenSecFileNameTxt);
                SevenSecVideoName.setText("File Name...");
                SevenSecVideoName.setTextColor(Color.parseColor("#797979"));

                e.printStackTrace();
                Toast.makeText(SellerHomePage.this,"Please pick a valid video",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

I have it so unauthenticated users can upload to the S3

Error code from Android Monitor:

03-30 19:27:52.469 2255-2255/com.wilsapp.wilsapp D/CognitoCachingCredentialsProvider: Loading credentials from SharedPreferences
03-30 19:27:52.469 2255-2255/com.wilsapp.wilsapp D/CognitoCachingCredentialsProvider: No valid credentials found in SharedPreferences
03-30 19:27:53.141 2255-2255/com.wilsapp.wilsapp I/Choreographer: Skipped 33 frames!  The application may be doing too much work on its main thread.

You may use it like this

Below code is used to access your aws s3 in which you have to pass accessKey and secretKey as your credentials.

            BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey,secret);
            AmazonS3Client s3 = new AmazonS3Client(credentials);
            s3.setRegion(Region.getRegion(Regions.US_EAST_1));

Transfer utility is the Class from which you can upload your file to s3.

            TransferUtility transferUtility = new TransferUtility(s3, UploadFileActivity.this);

Get the path of your file from your storage and pass it as a file as below

            //You have to pass your file path here.
            File file = new File(filePath);
            if(!file.exists()) {
                Toast.makeText(UploadFileActivity.this, "File Not Found!", Toast.LENGTH_SHORT).show();
                return;
            }
            TransferObserver observer = transferUtility.upload(
                    Config.BUCKETNAME,
                    "video_test.jpg",
                    file
            );

Here you can use observer.setTransferListener to know the progress of your uploading file

            observer.setTransferListener(new TransferListener() {
                @Override
                public void onStateChanged(int id, TransferState state) {

                    if (state.COMPLETED.equals(observer.getState())) {

                        Toast.makeText(UploadFilesActivity.this, "File Upload Complete", Toast.LENGTH_SHORT).show();
                    }
                }

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {

                }

                @Override
                public void onError(int id, Exception ex) {

                    Toast.makeText(UploadFilesActivity.this, "" + ex.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });

Your CognitoCachingCredentialsProvider is not initialized correctly. You need to initialize it with the IdentityPoolId which is of the format <region>:<guid> . You currently seem to using the identity pool name.

EDIT:

"wilsapp_MOBILEHUB_1766067928", is the name of the pool it is not the Pool id. To get the pool id go to Cognito console -> click on the name of the pool -> sample code -> copy the pool id from the sample

EDIT2: You will not get exception directly from S3 in your try catch. Instead, You can set Listener to your observer and listen t updates on upload/download

observer.setListener(new TransferListener() {
   public onProgressChanged(int id, long bytesCurrent, long bytesTotal){
     //update progress
   }

   public void onStateChanged(int id, TransferState state) {
     //check the state
   }

   public void onError(int id, Exception ex) {
     //log error
   }
});

It has onError method which returns an exception to track in case there is an exception

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM