Android Amazon S3 功能接入

前段时间项目需求需要接入亚马逊的S3云服务存储视频、图片资源,但是发现网上关于Android 端Amazon S3的资料写的都不是特别充足,于是专门写一篇给需要接入此功能的作为参考。

Amazon 官网

Amazon S3 Andoroid SDK文档

**1.准备工作**

1. 首先你得去Amazon平台注册一个账号(传送门)

    注册账号以后在你的电脑上安装CLI,这个工具是为应用创建,集成和管理AWS云服务。

2. 假如你还没有安装:node.jsnpm请点击连接下载最新版本

3. 安装成功以后在AS的Terminal里面输入 node -v 查看当前node 版本

输入npm -v 查看当前npm版本

4. npm更新命令:npm-check 检查更新 npm-upgrade更新,保证正在运行至少运行Node.js的版本大于8.11+,NPM版本大于5.x

**2.开始接入**

- 先依赖一下所需要的架包

        //AWS

        implementation 'com.amazonaws:aws-android-sdk-s3:2.12.+'

        implementation('com.amazonaws:aws-android-sdk-mobile-client:2.12.+@aar') { transitive = true }

        implementation('com.amazonaws:aws-android-sdk-auth-userpools:2.12.+@aar') { transitive = true }

        implementation 'org.testng:testng:6.9.6'

        //Base SDK

        implementation 'com.amazonaws:aws-android-sdk-core:2.12.+'

        //AppSync SDK

        implementation 'com.amazonaws:aws-android-sdk-appsync:2.7.+'

        implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'

        implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

- 在清单文件里添加

    <service android:name="org.eclipse.paho.android.service.MqttService" />

    <service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService" android:enabled="true" />

- 输入命令  `npm install -g @aws-amplify/cli`

输入命令  `amplify configure`

输入完成以后如图提示跳转到官网去进行用户创建和配置根据网站提示操作

创建完成用户以后会有一个用户的KeyID和Secret access key 记得保存下来

- 在控制台Enter后会提示你选择地区我这里选择的是美国东部,控制台选择的地区和你的桶地区一致。配置好你在官网创建的Access key ID和Secret access key,之后Enter再创建你的文件名。


输入命令 `amplify init`初始化配置

- 输入命令 `amplify push`

最后输入命令 `amplify update api` 我这里已经配置好了就直接显示了

- 这个时候去你的项目里 `./app/src/main/res/raw` 查看 可以看见存在一个

  `awsconfiguration.json`的配置文件,`Buket`是你的桶名,`Region`则是你的地区,之后需要更换桶名和地区直接在这更换就好了。


**3.代码部分**

10. 由于从2.7.0版开始TransferService将不会自动启动或停止TransferUtility。所以你必须在你的`Application`里面添加以下代码去启动TransferService服务。

    //AWS 上传

            mAWSAppSyncClient = AWSAppSyncClient.builder()

                    .context(getApplicationContext())

                    .awsConfiguration(new AWSConfiguration(getApplicationContext()))

                    .build();

        getApplicationContext().startService(new Intent(getApplicationContext(), TransferService.class));

- 上传文件代码,我这里上传一张图片作为案例。Constants类里填好自己的Key和密钥

    private static String IMAGE_DATA_NAME = "public/user2"+DateUtil.getYear()+""+DateUtil.getMonth()+""+DateUtil.getDay()+""+ RandomUntil.getNewRandomCode(6)+".jpg";

        //上传头像地址(用于下次加载图片)

        private static String PAHT =  Constants.AMAZON_S3_PIC + IMAGE_DATA_NAME;


    /**

        * 上传到AWS

        */

        private void AwsTest() {

            AWSMobileClient.getInstance().initialize(getApplicationContext(), new Callback<UserStateDetails>() {

                @Override

                public void onResult(UserStateDetails userStateDetails) {

                    Log.i(TAG, "AWSMobileClient initialized. User State is " + userStateDetails.getUserState());

                }


                @Override

                public void onError(Exception e) {

                    Log.e(TAG, "Initialization error.", e);

                }

            });

            uploadWithTransferUtility();

        }

        public void uploadWithTransferUtility() {

        AWSCredentials credentials = new BasicAWSCredentials(Constants.AMAZON_S3_KEY, Constants.AMAZON_S3_KEY_PWD);

        TransferUtility transferUtility =

                TransferUtility.builder()

                        .context(getApplicationContext())

                        .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())

                        .s3Client(new AmazonS3Client(credentials))

                        .build();

        TransferObserver uploadObserver =

                transferUtility.upload(

                        IMAGE_DATA_NAME,

                        new File(mImageCropPath));

        // Attach a listener to the observer to get state update and progress notifications

        uploadObserver.setTransferListener(new TransferListener() {

            @Override

            public void onStateChanged(int id, TransferState state) {

                if (TransferState.COMPLETED == state) {

                    // Handle a completed upload.

                    LogUtil.d(TAG,"AWS上传图片:"+IMAGE_DATA_NAME+"成功");

                }

            }

            @Override

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

                float percentDonef = ((float) bytesCurrent / (float) bytesTotal) * 100;

                int percentDone = (int)percentDonef;

                Log.d("YourActivity", "ID:" + id + " bytesCurrent: " + bytesCurrent

                        + " bytesTotal: " + bytesTotal + " " + percentDone + "%");

            }

            @Override

            public void onError(int id, Exception ex) {

                // Handle errors

                LogUtil.d(TAG,"AWS上传图片:"+IMAGE_DATA_NAME+"失败");

                PAHT = "";

            }

        });

        // If you prefer to poll for the data, instead of attaching a

        // listener, check for the state and progress in the observer.

        if (TransferState.COMPLETED == uploadObserver.getState()) {

            // Handle a completed upload.

        }

        Log.d("YourActivity", "Bytes Transferred: " + uploadObserver.getBytesTransferred());

        Log.d("YourActivity", "Bytes Total: " + uploadObserver.getBytesTotal());

    }

- 在你需要下载的`Activity`的`onCreat`方法中添加

```

  /**

    * AWS下载

    */

      private void AwsDownld() {

            AWSMobileClient.getInstance().initialize(getApplicationContext(), new Callback<UserStateDetails>() {

                @Override

                public void onResult(UserStateDetails userStateDetails) {

                    Log.i(TAG, "AWSMobileClient initialized. User State is " + userStateDetails.getUserState());

                }


                @Override

                public void onError(Exception e) {

                    Log.e(TAG, "Initialization error.", e);

                }

            });

            downloadWithTransferUtility();

    }

    private void downloadWithTransferUtility() {

        TransferUtility transferUtility =

            TransferUtility.builder()

                    .context(getApplicationContext())

                    .awsConfiguration(AWSMobileClient.getInstance().getConfiguration())

                    .s3Client(new AmazonS3Client(AWSMobileClient.getInstance()))

                    .build();

        TransferObserver downloadObserver =

            transferUtility.download(

                    "public/s3Key.txt",

                    new File("/path/to/file/localFile.txt"));

        // Attach a listener to the observer to get state update and progress notifications

        downloadObserver.setTransferListener(new TransferListener() {

            @Override

            public void onStateChanged(int id, TransferState state) {

                if (TransferState.COMPLETED == state) {

                    // Handle a completed upload.

                }

            }

            @Override

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

                    float percentDonef = ((float)bytesCurrent/(float)bytesTotal) * 100;

                    int percentDone = (int)percentDonef;

                    Log.d("Your Activity", "  ID:" + id + "  bytesCurrent: " + bytesCurrent + "  bytesTotal: " + bytesTotal + " " + percentDone + "%");

            }

            @Override

            public void onError(int id, Exception ex) {

                // Handle errors

            }

        });

        // If you prefer to poll for the data, instead of attaching a

        // listener, check for the state and progress in the observer.

        if (TransferState.COMPLETED == downloadObserver.getState()) {

            // Handle a completed upload.

        }

        Log.d("Your Activity", "Bytes Transferred: " + downloadObserver.getBytesTransferred());

        Log.d("Your Activity", "Bytes Total: " + downloadObserver.getBytesTotal());

    }

}

- 最后上传成功后就可以在Amazon S3控制台的桶里查看了

**总结**

Amazon S3上传、下载只是其中两个比较简单一些的操作,还有跟踪转移、暂停、恢复删除、推送、验证等等一系列操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342