How to play a video from Amazon S3 in Android App?
amazon-s3, amazon-web-services, android, bytearrayoutputstream, video
Solution
First we have to provide the name of our bucket and the object (see `aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo` for a complet guide) we want to open then get the URL to our object:
AWSCredentials myCredentials = new BasicAWSCredentials("YOUR_AMAZON_ACCESS_KEY_ID", "YOUR_AMAZON_SECRET_KEY_ID");
AmazonS3 s3client = new AmazonS3Client(myCredentials);
GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName);
URL objectURL = s3client.generatePresignedUrl(request);
Now, just play the video in a video view, supplying the URL obtained:
getWindow().setFormat(PixelFormat.TRANSLUCENT);
mediaCtrl = new MediaController(this);
mediaCtrl.setMediaPlayer(videoView);
videoView.setMediaController(mediaCtrl);
Uri clip = Uri.parse(objectURL.toString());
videoView.setVideoURI(clip);
videoView.requestFocus();
videoView.start();
I want to give thanks to @CommonsWare for
indicating me through `REST API` (even the code I used is from `aws-sdk` reading the `REST API` documentation helped me and show also other ways of requesting Amazon objects)
indicating me to use `generatePresignedUrl()`
the code for playing the video is also inspired from his materials.
Problem
I use `aws-android-sdk-1.4.3/samples/S3_SimpleDB_SNS_SQS_Demo` to preview my files stored on Amazon (Amazon Simple Storage Service). Looking through code I saw that they use this, to acces the files: `com.amazonaws.demo.s3.S3.getDataForObject (line 130)` ``` public static String getDataForObject( String bucketName, String objectName ) { return read( getInstance().getObject( bucketName, objectName ).getObjectContent() ); } protected static String read( InputStream stream ) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream( 8196 ); byte[] buffer = new byte[1024]; int length = 0; while ( ( length = stream.read( buffer ) ) > 0 ) { baos.write( buffer, 0, length ); } return baos.toString(); } catch ( Exception exception ) { return exception.getMessage(); } } ``` } Well, I have modified this methods to return `ByteArrayOutputStream` instead then I easily transform it to `String` or `Bitmap` (applying `ByteArrayOutputStream.toByteArray()` then using `BitmapFactory.decodeByteArray(byte[] data, int offset, int length, Options opts)`). So, it works on text-files and pictures. My problem is when I try to access videos. So, my questions are: 1.Using the method provided above, how could I get a video from `ByteArrayOutputStream` (`ByteArrayOutputStream.toString()`) and play it in a `VideoView` or using `MediaPlayer` or an approach... ? 2 . Does anybody know any other solution to this problem of preview videos stored on Amazon ? (I heard that on their `sdk` for `IOS` they use URLs to access files...) PS: Supplying the file URL and open it in browser does not make sense, because this URLs expire after a wile.