こんにちは。今回はこの5月8日に公開されたGoogle Photos APIsを使ってできることについてまとめていきたいと思います!
これまではGooglePhoto用のAPIは存在しておらず代わりにPicasa APIsを代用して行うやり方が知られていました。当然GooglePhotoの売りでもある無制限のアップロードができない(高画質ではなく元のサイズでアップロードされるため)などの課題もありました。
そんななかついに待望のGoogle Photos APIsが公開されました!!
まだ公開されたてなのでどこまでできるのかわかりませんがこのAPIでどこまでできるのか確認してみました!
ちなみに以下が公式サイトです
https://developers.google.com/photos/
①まず最初に
まずAPIを有効にするところからです。Google Cloud Platform(https://console.cloud.google.com/)へ遷移し、プロジェクトを選択します。
そして検索。Photoと検索すると「Photos Library API」が出てくるので選択。遷移後画面で「有効にする」を選択します。
次に認証情報を選び、認証情報ボタンをクリック、OAuthクライアントIDを選択する。そこから先は一般的なGoogleのAPIと同じなので流れは割愛する。
これでAPIを使えるようになった。
②アルバム一覧を取得する
では早速使っていこう!!
まずはGooglePhotoに作られているアルバム情報を取得する方法を紹介します
1.GoogleAccountCredentialの作成。スコープは「https://www.googleapis.com/auth/photoslibrary」でいったん大丈夫です。
1 |
GoogleAccountCredential mCredential = GoogleAccountCredential.usingOAuth2(this, Arrays.asList("https://www.googleapis.com/auth/photoslibrary")); |
2.使用するGoogleアカウントを選択する。引数の2つ目の数字は1以外でも当然可能です。onActivityResultへ戻ってくるのでその際に使います
1 |
startActivityForResult(mCredential.newChooseAccountIntent(), 1); |
3.アクセストークンを取得する
1 2 |
String accessToken = GoogleAuthUtil.getToken(SettingGooglePhotosActivity.this, new Account(accountName, accountType), "oauth2:https://www.googleapis.com/auth/photoslibrary"); |
4.3のアクセストークンを利用してアルバム情報を取得する。通信ライブラリーとしてOkHttpを利用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Request request = new Request.Builder() .url("https://photoslibrary.googleapis.com/v1/albums") .addHeader("Authorization", "Bearer " + token) .build(); OkHttpClient client = new OkHttpClient(); Response response = null; String html = ""; try { response = client.newCall(request).execute(); html = response.body().string(); } catch (IOException e) { e.printStackTrace(); } |
これでJSON形式のアルバム情報を取得できる。イメージとしては以下のような形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
{ "albums": [ { "id": "...", "title": "○○○○", "productUrl": "https://photos.google.com/lr/album/...", "totalMediaItems": "1", "coverPhotoBaseUrl": "https://lh3.googleusercontent.com/photos-library/..." }, { "id": "...", "title": "△△△△△△△", "productUrl": "https://photos.google.com/lr/album/...", "totalMediaItems": "5", "coverPhotoBaseUrl": "https://lh3.googleusercontent.com/photos-library/..." }, { "id": "...", "title": "□□□□□□□□□", "productUrl": "https://photos.google.com/lr/album/A...", "totalMediaItems": "3", "coverPhotoBaseUrl": "https://lh3.googleusercontent.com/photos-library/..." }, : : ] } |
③画像をアップロードする
つぎはGooglePhotoに画像をアップロードする方法です。アクセストークン取得までは上記と同じです
1.アップロードURLへPOST
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
RequestBody requestBody =RequestBody.create(MediaType.parse(fileExtension), new File(uploadPhotoData.getFilePath())); Request request = new Request.Builder() .url("https://photoslibrary.googleapis.com/v1/uploads") .addHeader("Authorization", "Bearer " + accessToken ) .addHeader("Content-type", "application/octet-stream") .addHeader("X-Goog-Upload-File-Name", uploadPhotoData.getName()) .post(requestBody) .build(); OkHttpClient client = new OkHttpClient(); Response response = null; String uploadToken = ""; try { response = client.newCall(request).execute(); uploadToken = response.body().string(); }catch (IOException e) { e.printStackTrace(); } |
2.取得したuploadTokenを使って[メディアアイテムの作成]を実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SimpleMediaItem simpleMediaItem = new SimpleMediaItem(uploadToken); NewMediaItems newMediaItems = new NewMediaItems(simpleMediaItem); List listNewMediaItems = new ArrayList(); listNewMediaItems.add(newMediaItems); GooglePhotoJson googlePhotoJson = new GooglePhotoJson(uploadPhotoData.getParentId(), listNewMediaItems); Gson gson = new Gson(); String json = gson.toJson(googlePhotoJson); Request request2 = new Request.Builder() .url("https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate") .addHeader("Authorization", "Bearer " + accessToken ) .addHeader("Content-type", "application/json") .post(RequestBody.create(MediaType.parse("application/json"), json)) .build(); response = client.newCall(request2).execute(); uploadToken = response.body().string(); |
jsonについてだが
1 |
{ "newMediaItems":[ { "simpleMediaItem": { "uploadToken": "CAIS6QIApKFirX....." }} ] } |
の形ができるようにGSONを使って実装している。
④特定のアルバムへの写真のアップロード
最後に特定へのアルバムに画像をアップロードする方法です。基本は②と同じですがメディアアイテム作成時のJSONが
1 |
{ "albumId": "...", "newMediaItems":[ { "simpleMediaItem": { "uploadToken": "CAIS6QIApKFirf3Zl..." }} ] } |
へと変更になります。ここのalbumIdは①で確認したアルバム一覧のIDに当たります。
⑤課題
・④のアルバムへのアップロードですがすべてのアルバムでアップロードができるわけではありません。アップロードができるアルバムは
1.アルバムのオーナーが自分であること
2.このAPIを使って作成したアルバムであること
現状わかっているのはこの2点です。とくに2ですが今まで作ってきたアルバムには現状書き込めないことになります。。。
・結局Picasa時代と変わらずアップロードすると高画質ではなく元のサイズでアップロードされたことになり保存容量を消費してしまう。
以上がGoogle Photos APIsを使った感想です。まだ公開されて1か月もたたず日本語の情報もほぼほぼない中なのですべてを理解できているわけではありませんが。。。今後さらに⑤の課題も解決されたAPIになってくれればなと思う今日このごろです。