AWS/Android Unable to calculate md5 hash
amazon-s3, amazon-web-services, android, md5
Solution
From KitKat, you can't read external storage without the permission.
See
http://developer.android.com/about/versions/android-4.4.html#Behaviors
http://developer.android.com/reference/android/Manifest.permission.html#READ_EXTERNAL_STORAGE
Problem
I'm customising Amazon's S3 Uploader sample program to suit my needs. After a bucket is created, I upload a video to it. ``` PutObjectRequest por = new PutObjectRequest(buckets.get(0).getName(), Constants.VIDEO_NAME, new java.io.File(filePath)); ``` When I run the line above I get back the exception below: ``` Unable to calculate MD5 has: /storage/....../bla.mp4: open failed: EACCES (Permission Denied) ``` Stack Trace: ``` 12-04 14:39:21.981 29372-29441/com.amazonaws.demo.s3uploader E/ERR﹕ com.amazonaws.AmazonClientException: Unable to calculate MD5 hash: /storage/emulated/0/DCIM/Camera/VID_20131203_180120.mp4: open failed: EACCES (Permission denied) at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1139) at com.amazonaws.demo.s3uploader.S3UploaderActivity$S3PutObjectTask.doInBackground(S3UploaderActivity.java:160) at com.amazonaws.demo.s3uploader.S3UploaderActivity$S3PutObjectTask.doInBackground(S3UploaderActivity.java:120) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) Caused by: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/VID_20131203_180120.mp4: open failed: EACCES (Permission denied) at libcore.io.IoBridge.open(IoBridge.java:409) at java.io.FileInputStream.<init>(FileInputStream.java:78) at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1135) at com.amazonaws.demo.s3uploader.S3UploaderActivity$S3PutObjectTask.doInBackground(S3UploaderActivity.java:160) at com.amazonaws.demo.s3uploader.S3UploaderActivity$S3PutObjectTask.doInBackground(S3UploaderActivity.java:120) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) at libcore.io.IoBridge.open(IoBridge.java:393) at java.io.FileInputStream.<init>(FileInputStream.java:78) at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1135) at com.amazonaws.demo.s3uploader.S3UploaderActivity$S3PutObjectTask.doInBackground(S3UploaderActivity.java:160) at com.amazonaws.demo.s3uploader.S3UploaderActivity$S3PutObjectTask.doInBackground(S3UploaderActivity.java:120) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) ``` OS = 4.4/KitKat, Device = Nexus 4 What's going on?