2013年5月23日木曜日

Google I/O - Android : What's New in Google Play Services


What is "Google Play Services

Google services と Play services 向けの API を Android デバイスの1ヶ所にまとめた単一のライブラリー
Android 2.2 以上に対応している(= デバイスのサポートについて心配しなくていいよってこと)

・主な機能
  • Maps(Location)、(以前からある MapsFragment V2 も含まれる)
  • Google Play games
  • Google Cloud Messaging
  • Google Wallet instant buy
  • Google+ sign-in
  • OAuth2(Google Play Services がライブラリを介して Google services へのアクセスを取得するための単一の認証 API を提供すし、ユーザーは一貫性のある方法で OAuth access token を受信できる)
Google Play Services は Google エコシステムのためのプラットフォームのコア部分であるため、常に最新の状態にしておく必要がある
バグ修正やアップデートを、 Android フレームワークやキャリアのリリーススケジュールの外で行う必要がある。
そのため Play Store を通じてアップデートされる


・なぜ Android 2.2 以上なのか?

Android 2.2 以上は、Play Store にアクセスする有効な Android ユーザー全体の 98.2% に達しており、さらに Froyo ではマスストレージにアプリケーションをインストールするような便利な API が追加されていて、Google Play Services を使うほとんどのアプリケーションが利用する API があるから。


・なぜ Google Play Services と Android support library の2つにわけたのか?

Google Play Services は Play エコシステムをサポートし、開発者が(そのエコシステムの) API を使えるようにしている
Android support library は Android エコシステム向けのオープンソースのラリブラリー


What's New?

・Location based services

■ Fused Location Provider
(いままでは MapFragment V2 があった)
  • Google Play Services で位置を取得できるようになった
  • ここで提供した理由は、今までより賢くやる能力があるから
  • Fused Location Provider というめんどうなことを全部やってくれる新しいプロバイダーが増えた
  • 今までの方法で位置検出をやったことがある開発者なら、常に効果的な方法でベストな位置を取得するのはかなり面倒であることを知ってると思う。ベストプラクティスを実現するにはかなりの量のコードを書かないといけない
この面倒なことをすべて Fused Location Provider の後ろに入れこんだので、これが全部やってくれる。どのプロバイダーが有効か、どれがオンでどれがオフになっていて、どのプロバイダーが最適な結果を提供しているのかを、特定の時間に検出してくれる。

使うのもすごく簡単。ほとんどの Google Play Services のクライアントと同じく、インスタンスを作り、connect を呼び、非同期で servic やアプリケーションを Google Play Services の service とバインドする。
一度こうすれば、今までの古い location-based services client と同じ方法で Location client を扱えるようになる。 private void connectLBS() { int gpsExists = GooglePlaySErvicesUtil.isGooglePlayServicesAvailable(This); if (gpsExists == ConnectionResult.SUCCESS) { mLocationClient = new LocationClient(this, this, this); mLocationClient.connect(); } } @Override public void onConnected(Bundle connectionHint) { requestUpdates(mlocationClient); } LocationRequest request = LocationRequest.create(); request.setInterval(minTime); request.setPriority(lowPowerMoreImportantThanAccuracy ? LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY : LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationClient.requestLocationUpdates(request, new LocationListener() { @Override public void onLocationChanged(Location location) { updateLocation(location); } } ただの interval 以外に minimum interval や maximum interval もセットできる

Google Play Services の一部として常にロジックをアップデートできるので、アプリ側の修正をしなくてもより正確でより効果的な手法が各リリースで届けられる。


■ Geofenceing API
  • 以前の proximity alerts のようなものと予測できるが、これは実際にちゃんと使える
  • 各アプリケーションの geofences を全て常にトラックし、それぞれの geofences の境界からどのくらい離れているかに応じて、どのプロバイダーが使われるべきかを判断する
位置と半径で簡単に geofence の境界を作成できる List<Geofence> fenceList = new ArrayList<Geofence>(); // TODO Repeat for all Geofences Geofence geofence = new Geofence.Builder() .setRequestId(mKey) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .setCircularRegion(latitude, longitude, GEOFENCE_RADIUS) .setExpirationDuration(Geofence.NEVER_EXPIRE) .build(); fenceList.add(geofence); mLocationClient.addGeofences(fenceList, pendingIntent, addGeofenceResultListener); これらは中心の Fused Location Provider で処理される。GPS を使うべきなのか Cell ID なのかはそれが全部やってくれる。


■ Activity recognition
  • ユーザーがどこにいるかだけではなく、ユーザーが何をしているか(どういう身体活動をしているか)もわかるようになった
  • 単に立っているのか、走っているのか、自転車に乗っているのか、車に乗っているのか
  • まったく新しいカテゴリのアプリを作ってもいいし、フィットネスアプリでユーザーに現在の活動を手動で選んでもらう代わりにも使える
活動のアップデートをリクエストして、インターバルをセットするだけ Intent intent = new Intent(this, ActivityRecognitionIntentService.class); intent.setAction(MyActivity.ACTION_STRING); PendingIntent pi = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); mActivityRecognitionClient.requestActivityUpdates(interval, pi); @Override protected void onHandleIntent(Intent intent) { if(intent.getAction() == MyActivity.ACTION_STRING) { if(ActivityRecognitionResult.hasResult(intent)) { ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); DetectedActivity detectedActivity = result.getMostProbableActivity(); int activityType = detectedActivity.getType(); if (activityType == DetectedActivity.STILL) setUpdateSpeed(PAUSED); else if (activityType == DetectedActivity.IN_VEHICLE) setUpdateSpeed(FASTER); else setUpdateSpeed(REGULAR); } } } 身体活動に応じて異なるユーザー体験を提供することができる

例えば、近くの情報を表示する場合、立っているだけの状態ならアップデートを一時停止し、車のなかにいるならユーザーがいいレストランを見つけられるようにできるだけ早くアップデートする

例えば、スポーツスコアやニュースなら、立っているときにもっとも頻繁にアップデートし、自転車に乗っているなら電話はポケットにあるはずだからアップデートを行わない


これは全く新しい API なので大きなチャンスがある
ユーザーによりより体験、より効果的な体験を作るために、どのようにこの新しいセンサー情報を使えばいいのか考えて


より詳しくは Beyond the Blue Dot: New Features in Android Location

(↑のセッションがこのセッションの1つ前の時間帯だったので、「Android と Google Play Services に time travel API を作っていたらその時間に戻ってみることができるよ!でも残念ながらまだできない。。。」「あれ、まだリリースしてなかったけ?」「してないよ」「そんな遠くないよ。 11:15 だよ(このセッションは 12:45 から)」「えと、、、あとで話そう」「秘密だったね」「そうだよー。だから YouTube でチェックしてね」というやりとりがあるw)



・Google Play games
  • Achievements
  • Leaderboards
  • Cloud Save
  • Real-time Multiplayer invitations
新しい Developer console で左上の play games ロゴのタブを選択する。そうすると Leaderboard や Achievements を追加するところがある

■ Achievements

実際のゲーム内で、achievements のデフォルトの look and feel を提供する
achievements の小さいダイアログが表示され、全ての achievement 画面でもみることができる


■ Leaderboards

Leaderboards もデフォルトの look and feel を提供する


■ Cloud Save

4つの 128K のデータブロック(chunk)を持つことができ、ここにアプリケーション用のユーザーデータを保存できる
1つの chunk はアバター、別の chunk はプロフィール情報、ゲームの進捗情報、などをいれて同期する
Could Save は conflict resolution strategies (chunk のデータが衝突したときにどう解決するか)がある

より詳しくは New Developments in Mobile Gaming

これらの機能は Google+ によって支えられているので、Google+ sign-in をアプリに組み込むと、これらの play services の機能にアクセスできる。

より詳しくは Advanced Game Development Topics



・Google Cloud Messaging

すでに API になっていたが、Google Play Services の中にいれた

GCM はサーバーからクランとにアップデートしたいときに通知する

昔のよくない方法では定期的なアラームをセットしていた
この方法では、デバイスを起こし、無線を起こし、サーバーに「なんか、ダウンロードするものある?」と聞くために ping していたが、ほとんどの場合の答えは「なにもないよ」だった
もし答えが「あるよ」だったとしても「あるよ、でも2時間前なら役に立ったけどね」みたいなことがあった

GCM なら必要なときにクライアントに通知でき、通信量も電池の消費量も減らせる

新しい API では、永続的な XMPP 接続を開発者のサーバーと GCM サーバーに間に作ることができる。これにより、この接続を使ってデバイスから開発者のサーバーにメッセージを送れるようになった。low latency で high reliability な connection でデータを送れる

この機能を使って、アプリが動いているデバイスから、同じアプリが動いている別のデバイスにメッセージを送ることができる。キーノートの notification のデモのように複数のデバイスで同期させることができる

Upstream の実装はすごく簡単 GoogleCloudMessaging gcm = GoogleCloudMessaging.get(context); gcm.send(to, msgId, data); 直接サーバーとやりとりしたときは projectID を指定し、他のデバイスに転送してほしいときは notification ID を指定する


サーバー側についてより詳しくは Google Cloud Messaging


・Google Wallet instant buy
  • 制限があり、利用するにはホワイトリストユーザーになる必要がある
  • 現在は US only (らしい)
  • デバイスの Gmail アカウントとデバイス内の Google Wallet を使って、物理的な商品を Android アプリ内で売ることができる
  • 商品の販売を始めると、その情報がアップロードされ、アプリ内に instant buy での Google Wallet ボタンが表示される。それをタップするだけでクレジットカードの詳細やログインなしで購入できる
  • 購入のフローは簡単で、購入された商品の金額はデバイスの Google Wallet を通じてチャージされ、一緒に提供される住所に商品を送ればいい
より詳しくは Selling physical goods on Android with Google Wallet Instant Buy





どうやって使うの?

・Android 側

SDK manager で Google Play services をインストールし、extras 内の play services library をワークスペースにコピーする

詳しくは http://developer.android.com/google/play-services/setup.html

Panaorama というサンプルアプリがある


・API 側

Google API Console https://code.google.com/apis/console に行って、必要な API をオンにし、API key (アプリ内にコピペして使う)を取得する

API key は特定の証明書とパッケージ名にリンクしているので、そのアプリでしか使えない



Auth

Auth は紛らわしい。Authentication? Authorization?

Authentication : その人がだれかを認証する(デバイス内の Google アカウントは authenticated)
Authorization : その人のためにサービスへのアクセスを取得する

Google Play services は authenticated account(認証されたアカウント)に対する標準化された authorization を提供する
Google Play services ないのプロダクトだけでなく、Web の Google APIs に対しても使える

以前は、Google API 用の authorization token を取得するフローはそこそこ面倒だった。web view など他のものを利用しないといけなかったので、そのためのいいライブラリもいくつか書かれた
Google Play services でより簡単にトークンをとれるようになった

1. アカウントを選択する startActivityForResult( AccountPicker.newChooseAccountIntent(null, null, new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, "Can haz token plz?", null, null, null), REQUEST_PICK_ACCOUNT);

2. Preflight Check @Override protected void onResume() { super.onResume(); int canPlay = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); }

3. アクセストークンを取得 mToken = GoogleAuthUtil.getToken(this, "foo@gmail.com", "oauth2:" + Scopes.PLUS_PROFILE + "," + YouTubeScopes.YOUTUBE_READONLY); ダイアログが表示される

4. データにアクセスする URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + token); HttpURLConnection con = (HttpURLConnection) url.openConnection(); int serverCode = con.getResponseCode(); if(serverCode == 200) { ... } else { // check error, code do something else return; }


Adding a +1 button <com.google.android.gms.plu.PlusOneButton android:id="@+id/plus_button" android:layout_width="wrap_content" android:layout_width="wrap_content" plus:annotation="inline" plus:size="standard" /> button.initialize(mPlusClient, "http//...", null); とある URL に +1 できるボタン


Google Play services はどうテストしたらいいの?

「デバイスを買いたまえ!2.2以上のやつを...」
「いやいや、みんがテスト用のデバイスを買うかどうかわらないじゃないか、もっといい方法ないの?」
「実はあるよ。。。Google Play services emulator をリリースしたよ!」

Google APIs emulator をベースにしている
Play services のメジャーリリースごとにアップデートする予定



QA

Q. x86 イメージの play services エミュレータはありますか? ARM だけ?
A. まだローンチしてないと思う。ARM のしか見たことないよ。。。(他の人にきいている)ないって。tools チームのエミュレータの人と話すといいと思うよ

Q. WebView を Google Play services でリリースする計画はありますか?異なるバージョンの OS に渡って update できるように
A. いい質問ですね。現状でこの点で行ったものはないし、将来の計画もわからないです。

Q. Google Play services のアップグレードの頻度はどのくらいですか?
A. すごく早いよ、毎週かな。

Q. Google play games をゲーム以外のアプリに使ってもいいのですか? FourSquare のバッチのようなのを考えています。 A. もちろん。Cloud Save のような機能はゲーム以外のものにも適しています。achievements もゲーム以外でも有効だと思います。 ゲームカテゴリーじゃないといけないなどの制限はないです。

Q. geofence の制限(100個まで)はアプリ毎ですか?ユーザーが毎ですか? A. アプリケーションあたり100個です。

Q. Google Play services のアップデートが(なにかの原因で)行われなかった場合、アプリはどうバージョンコントロールすればいいですか? A. Google Play services はそれを利用しているアプリが起動するたびに update があるかどうかチェックします。

Q. Cloud Save の容量制限を超えることはできますか?
A. Google Drive API 使ってください。

Q. Geofence はクラウドに保存されますか?デバイスに保存されますか?
A. デバイスに保存されます。毎回クラウドに聞きにいくと通信を圧迫するからです。

Q. Could Save はいつクリアされますか?マニュアルですか? A. いい質問ですね。マニュアルだったと思います。https://developers.android.com/games をみてください。





0 件のコメント:

コメントを投稿