2016-03-30 168 views
0

我将AWS Android SDK添加到了我的应用程序,并且我在AsyncTask中有一些代码应该将我的视频上传到我的存储桶,但它不工作。将视频从Android上传到AWS S3

的Android代码:

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

我有这样未经授权的用户可以上传从Android监视器S3

错误代码:

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. 

回答

1

你CognitoCachingCredentialsProvider未正确初始化。您需要使用格式为<region>:<guid>的IdentityPoolId对其进行初始化。您目前似乎使用身份池名称。

编辑:

“wilsapp_MOBILEHUB_1766067928”,是池的名称是不是池ID。要获取池ID转到Cognito控制台 - >单击池的名称 - >示例代码 - >从样本中复制池ID

EDIT2: 在try catch中不会直接从S3中获取异常。相反, 您可以设置监听到你的观察和监听上传牛逼更新/下载

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

它onError方法返回一个例外跟踪的情况下,有一个例外

+0

对不起,但你能请澄清答案:D –

+0

刚刚编辑我的意见,希望它可以帮助 – Karthik

+0

好了,帮助!但我现在正在运行我的代码,并在Android监视器中出现此错误(检查问题)我还添加了更多我的代码。 –

0

您可以使用它像此

下面的代码用于访问您的aws s3,您必须在其中传递accessKey和secretKey作为您的凭证。

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

转移实用程序是您可以将文件上传到s3的类。

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

从存储让你的文件的路径,并把它作为一个文件,如下

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

在这里,您可以使用observer.setTransferListener知道你的上传文件的进度

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

请添加一些关于如何解决原始问题的评论。仅有代码的答案往往会被标记为“低质量”并被删除。 – Graham