Google Drive Android API Google Play Services に統合された Women Techmakers: Kyoto Google Playかいはつしゃサービス
Jun 10, 2015
Google Drive Android APIGoogle Play Services に統合された
Women Techmakers: Kyoto
Google Playかいはつしゃサービス
自己紹介 Junko Suzuki
愛知県から来ましたWeekend ProgrammerAndroid/iPhoneの健康管理アプリ『はかるだけレポート』など公開してます
Google Play https://play.google.com/store/apps/developer?id=KEROKKO iTunes https://itunes.apple.com/jp/artist/junko-suzuki/id454449706
なぜGoogle Driveか?何に使いたいのか? (MYアプリの場合)
データのクラウド化ができたら嬉しい
他のじゃだめなの?(Dropなんたらとか)身近な非ITな人はアカウント持ってないよGoogleアカウントなら持っていそう
GoogleのサービスをAndroidで使う 無理なく使えそう
このAPI、前からあったのでは?
Google Play Serviceに組み込まれ、更に強力に使いやすく
生まれ変わった!
Google Play Services 4.1でDeveloper Preview版(2014/1月) Google Play Services 4.2で正式版がリリース(2014/2月)
Google Playかいはつしゃサービス
Google Play Serviceとは?ある日突然、勝手にインストールされた謎アプリ
『開発者サービス』という日本語名のためアンインストールする人続出
Google Playかいはつしゃサービス
Google map、Google+、アカウント認証などで使われる機能が入った、 とても重要なアプリ! ・・と見せかけたライブラリ的なもの
というわけで、まだ生まれたてな
『G Play Serviceに入ってる版 Google Drive Android API』について、『特長』と『組み込み方』をまとめました。
特長
特長1 ローカル?意識しなくてOKオフライン時にAPI呼び出しが失敗した時の処理書かなくっちゃ↓心配無用!↓ネットワークにつながっていなくても、電池がなくなっても、Androidの同期スケジューラーが、勝手にやってくれる
特長2 Android用に作られているG Play Serviceに統合されたことで、 アプリ自体の負担が少ない
アプリ(apk)のサイズが大きくならない↓◎ダウンロードが高速に◎アップデートも少なく◎メモリの消費も抑えられる
他のデバイス間でも自動的に同期
特長3 UI部品が用意されている
ほんの数行のコードで組み込める!
特長4 Storage Access Framework を使っているStorage Access Frameworkとは・・・ Android 4.4 KitKat でリリース 複数のストレージプロバイダで動作 (クラウドもローカルも含む) メタデータやシェア機能などへもアクセス
つまり、DropboxもGoogle Driveもギャラリーもダウンロードフォルダも、汎用的に扱える!
でも・・・KitKat以降でしか使えないんじゃ?
G Drive APIはGoogle Play servicesの一部として提供されるので、ご心配なく!
KitKatだけでなく、Android 2.3 Gingerbread以上
のデバイスでサポート
(2.2向けの場合G Play Services for Froyoもあり)
組み込み方
1. G Play Serviceライブラリの準備↓2. 証明書取得とアプリの登録↓3. アプリへの組み込み(接続・認証)↓4. アプリへの組み込み (ファイル読み書き)
全体の流れ
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
手順1 ライブラリの準備Android SDK Manager でG Play Serviceをインストール
G Play ServiceのプロジェクトをWorkspaceにインポート
インポートしたライブラリへの参照を、作成するアプリに設定
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
手順1 ライブラリの準備作成するアプリのManifestファイルに<meta-data>タグを追加
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
<meta-data android:name="com.google.android.gms.version“ android:value ="@integer/google_play_services_version“/>
手順1 ライブラリの準備作成するアプリのproject直下の proguard-project.txtに追加
※ProGuard(難読化ツール)が 必要なクラスを削除してしまうのを 避けるため
-keep class * extends java.util.ListResourceBundle {protected Object getContents();
}・・・・・略・・・・・
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
手順2 証明書取得とアプリ登録署名付き証明書のSHA1フィンガープリント生成 ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
Certificate fingerprints: SHA1: D8:AA:43:97:59:EE:C5:95:26:6A:07:EE:1C:37:8E:F4:F0:C8:05:C8
ターミナルウィンドウから keytool で。
赤字部分を次の手順内でコピペして使う
手順2 証明書取得とアプリ登録Google Developers Console でアプリ登録しクライアントID 作成
前手順のフィンガープリントをペースト
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
手順3 接続・認証GoogleAPIClientのインスタンス
mGoogleApiClient = new GoogleApiClient.Builder(this) .addApi(Drive.API) .addScope(Drive.SCOPE_FILE) .addConnectionCallbacks(this) ※ .addOnConnectionFailedListener(this) ※ .build();
※ G Play Serviceとの接続が 成功 / 失敗した時の処理を行うため
onCreate()の中などライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
手順3 接続・認証
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
接続と解除@Overrideprotected void onStart() { super.onStart(); if (!mResolvingError) { ※ mGoogleApiClient.connect(); }}@Overrideprotected void onStop() { mGoogleApiClient.disconnect(); super.onStop();}
※ 画面回転時など用にonSaveInstanceStateでエラー保持
手順3 接続・認証接続成功 (^-^)v
@Overridepublic void onConnected(Bundle connectionHint) { // Google Play Serviceに接続成功! // ファイル操作へ進んでください}
接続失敗 (T_T)・G Play Serviceが古い・アカウント認証前、など
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
@Overridepublic void onConnectionFailed (ConnectionResult result) { // 接続できなかった! // Serviceインストールや認証ダイアログへ }
G Play Serviceが端末に入っていないOR古い
インストールするよう誘導
勝手にやってくれる!
アプリから初めてG Play Serviceを使う
アカウントの選択から認証まで
勝手にやってくれる!
手順3 接続・認証既に認証済みで、何も問題なければ
ユーザーから見て、何もイベントは起こらない
アプリ内部では接続処理が行われる
ライブラリ
証明書取得
準備
コード
接続・認証
ファイル操作
手順4 ファイル作成・編集
ライブラリ
証明書取得
準備
コード
認証
ファイル操作
Contentsを作りコールバックを設定
Drive.DriveApi.newContents(mGoogleApiClient) .setResultCallback(fileCallback);
コールバック内でresult.contentsのOutputStreamに書き込み
新規ファイル作成Activity起動
新規ファイル作成Activityとは?MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() .setMimeType("text/plain") .setTitle("GDriveTest.txt").build();
IntentSender intentSender = Drive.DriveApi .newCreateFileActivityBuilder() .setInitialMetadata(metadataChangeSet) .setInitialContents(result.getContents()) .build(mGoogleApiClient);
startIntentSenderForResult(intentSender, CREATE_REQUEST_CODE, null, 0, 0, 0);
DriveApiに用意されていて
勝手にやってくれる!
(ピッカーを出さず)単にファイルを作りたいだけの場合は?
Drive.DriveApi.getRootFolder(mGoogleApiClient) .createFile(mGoogleApiClient, metadataChangeSet, result.getContents()) .setResultCallback(fileCallback);
でも、ちょっと注意!
その他にも、フォルダ操作など色々なメソッドが用意されている
ファイル名はユニークじゃない同名ファイルが複数ある可能性
(A) クエリで検索をかけてDriveIDをゲット OR(B) リソースID (文字列)をどこかに保持
→DriveIDをゲット
既存ファイルへのアクセスはDriveIDオブジェクトを使う(ファイル名で識別しないこと)
(A) ファイル名で問い合わせ → DriveID (複数ある可能性も要考慮)
Query query = new Query.Builder() .addFilter(Filters.eq(SearchableField.TITLE, filename)) .build(); Drive.DriveApi.query(mGoogleApiClient, query) .setResultCallback( new ResultCallback<DriveApi.MetadataBufferResult>() { @Override public void onResult(DriveApi.MetadataBufferResult result) { ・・・・ } }); ※クエリ対象: MIME_TYPE, MODIFIED_DATE,
PARENTS, STARRED, TITLE, TRASHED
ResultのcontensからgetDriveId()でゲット
(B) リソースID (文字列) → DriveID
Drive.DriveApi.fetchDriveId(mGoogleApiClient, EXISTING_FILE_ID) .setResultCallback(idCallback);
既存のリソースIDを渡し、コールバックをセット
コールバックのresult.getDriveId()でゲット
(A)(B) どちらかの方法でDriveIDをゲットしたら
DriveIDを使ってファイル編集
DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, result.getDriveId());
ContentsResult contentsResult=file.openContents( mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null); OutputStream outputStream = contentsResult.getContents().getOutputStream();outputStream.write("Hello world".getBytes());
file.commitAndCloseContents(mGoogleApiClient, contentsResult.getContents());
DriveIDからDriveFileをゲット
Open → Edit → Close
最後にGoogle DevelopersのGoogle Drive Android API解説部分を日本語に訳しました。http://junsuke.hatenablog.com/entry/2014/02/20/095631
Android Studioを使う場合やフォルダ操作など、今回触れなかったケースについても解説されていますので詳しくはそちらを。
資料Google Developers “Google Drive Android API”https://developers.google.com/drive/android/
Android Developers “Google Drive Android API”https://developer.android.com/google/play-services/drive.html
Android Developers “Google Play Services”https://developer.android.com/google/play-services/index.html
GitHub: googledrive / android-demoshttps://github.com/googledrive/android-demos