AWS SDK for Android を試してみました。
下記を参考にしました。
AWS SDK for Android の入手
このページ(AWS SDK for Android (Beta)) から aws-android-sdk-0.1.0.zip をダウンロードします。
ワークスペースに展開します。
$ 7z x aws-android-sdk-0.1.0.zip
必要な前準備
- いつものようにプロジェクトを新規作成します。(File => New => Android Project)
- ライブラリに aws-android-sdk-0.1.0-obfuscated.jar を追加します。(Properties => Java Build Path => Libraries => Add External JARs…) SDK を展開した場所の lib の下にあります。
- インターネット通信を行うので、 AndroidManifest.xms の uses-resources に INTERNET を追加しておきます。
クライアントの生成
さっそく API を呼んでいきます。まずは S3 クライントを生成します。
// AccessKey と Secret Key を設定 AWSCredentials credentials = new BasicAWSCredentials("accesskey", "secretkey"); // S3 クライアントを生成 AmazonS3 s3 = new AmazonS3Client(credentials);
自分の AccessKey は アカウントのページ から確認できます。
Bucket の作成
S3 のオブジェクトはすべて Bucket に格納されます。まずはその Bucket を作ります。
// Bucket 生成 Bucket backet = s3.createBucket("takutless.testbucket");
Bucket 名に "_" を含んでいると例外が発生するので注意。(?) また S3 全体でユニークでないといけないようです。
Bucket名の決まりは クイックスタートガイド に下記のように記載されています。
Bucket names must comply with the following requirements. Bucket names:
- Can contain lowercase letters, numbers, periods (.), underscores (_), and dashes (-)
- Must start with a number or letter
- Must be between 3 and 255 characters long
- Must not be formatted as an IP address (e.g., 265.255.5.4)
オブジェクトの作成
作成した Bucket にオブジェクトを作成します。
// オブジェクトを作成 s3.putObject("takutless.testbucket", "mydir/myfile1.txt", inputStream, null);
Bucket "takutless.testbucket" に "mydir/myfile1.txt" という名前で inputStream の内容が保存されます。一緒に MetaData も指定できますが、省略(null)しました。
Management Console で確認すると Bucket が作成されて、ディレクトリ(mydir)とファイル(myfile1.txt)ができています。

オブジェクトのリスト取得
Bucket に格納されているオブジェクトのリストを取得してみます。
// Bucket に格納されているオブジェクトのリストを取得 ObjectListing objectListing = s3.listObjects("takutless.testbucket"); List<S3ObjectSummary> summaryList = objectListing.getObjectSummaries();
S3ObjectSummary にはオブジェクト名などの情報が格納されています。
ObjectListing objectListing = s3.listObjects("takutless.testbucket", "mydir/");
とすると、オブジェクト名が "mydir/" から始まるもののみ取得できます。
のはずなんですが、 listObjects() を実行すると例外が発生してしまいます。
Unable to unmarshall response (Couldn't initialize a sax driver for the XMLReader)
google 先生におうかがいを立ててみると こんな解決策 が…。理由はよくわかりませんが、下記のコードを追加してこの場をしのぎます。
System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver");
オブジェクトの取得
オブジェクトの中身は下記にようにして取得できます。
// オブジェクトを取得 S3Object object = s3.getObject("takutless.testbucket", "mydir/myfile.txt"); // オブジェクトの中身を取得 InputStream content = object.getObjectContent();
content から read() してファイルに保存するなりできます。
今回は最も手抜きなやり方を紹介しましたが、 S3 には Bucket のアクセス件や、オブジェクトのメタデータなども細かく管理でき、 API も色々用意されています。これだけ簡単だと、もっと使ってみたくなりますね!