2012年12月28日金曜日

アプリ内課金バージョン3 (In-App Billing Version 3)

ここではAndroid DevelopersのIn-app Billing Version 3のページを訳してみました。バージョン 3では、管理商品("managed products")のみをサポートしています。管理商品では、Google Playがユーザのアイテム所有の有無を全て管理してくれます。また、消費商品("consumable products")が扱えるようになりました。消費商品とは、ゲーム内の通貨など、アイテムが消費されるたび、再度購入ができるようになります。

In-app Billing Version 3
In-app Billing version 3 APIではアプリ内課金を簡単にあなたのアプリに統合することが出来ます。このバージョンは、改良された同期購入フロー、消費商品の所有の記録を簡単に行えるAPIやアプリ内購入データのローカルキャッシュなどの特徴を含んでいます。

Product Types
Google Play Developer Consoleを使って、商品タイプ、SKU、値段、説明文など、商品を定義することができます。詳細は、Administering In-app Billingを見てください。Version 3 APIは管理商品 ("managed products") のみサポートしています。

Managed In-app Products
アプリ内管理商品(managed in-app products) は、Google Playによって管理され記録された所有情報を持つアイテムです。ユーザが管理アイテムを購入したとき、Google Playは各ユーザごと、各アイテムの購入情報を保存します。特定ユーザが購入したアイテムの状態を復元するために、いつでもGoogle Playにクエリを送ることができます。ユーザがアプリをアンインストールしたり、ディバイスを変更したとしても、この情報はGoogle Play サーバ上に保存してあります。

Version 3 APIを使用する場合、アプリの中で管理アイテムを消費することができます。何度も購入することができるアイテム (例えばゲーム内の通貨、燃料や魔力など) の消費を実装することができます。いったん消費アイテムが購入されると、Google Playに消費リクエストを送ることでそのアイテムが消費されるまで、再び購入することは出来ません。商品の消費に関しての詳細は、Consuming Itemsを見てください。

Purchasing Items
Version 3 APIの購入の流れは以下の通りです。

  1. 使っているアプリ内課金 API のバージョンがサポートされているか確認するために、アプリはGoogle PlayにisBillingSupportedリクエストを送る。
  2. アプリがスタートしたときやユーザがログインしたとき、何のアイテムをユーザが所有しているか確定するために、Google Playでチェックすることを推奨します。ユーザのアプリ内商品の検索には、getPurchasesリクエストを送ります。リクエストが成功したら、Google Playは購入アイテムの商品IDのリスト、個々の購入アイテムの詳細リスト、購入のためのサインのリストを含んだBundleを返します。
  3. 通常、購入できる商品をユーザを知らせたいと思います。Google Playで定義した商品の詳細を検索するために、getSkuDetailsリクエストを送ることができます。検索リクエストには、商品IDのリストを明記する必要があります。リクエストが成功したら、Google Playは商品の値段、タイトル、詳細、購入タイプを含んだBundleを返します。
  4. 商品がユーザによって所有されていなかったら、購入プロセスを始めることができます。購入リクエストを始めるには、購入するアイテムの商品IDを他のパラメータと一緒にを明記した getBuyIntent リクエストを送ります。Developer Consoleで新しい商品を作るとき、商品IDを記録する必要があります。
a. Google Playは購入のためのチェックアウトUIをスタートするのに使うPendingIntentを含んだBundleを返します。 b. アプリはstartIntentSenderForResutメソッドを呼ぶことによってpending intentを立ち上げます。 c. チェックアウトフローが終了したとき (ユーザがアイテムを購入もしくは購入をキャンセルしたとき)、Google PlayはonActivityResultメソッドにレスポンスIntentを送ります。onActivityResutの結果コードは購入が行われたかキャンセルされたかどうかを示す結果コードを持っています。レスポンスIntentは購入されたアイテムについての情報を含んでいます。この購入取引を特定するために、レスポンス Intentはgoogle Playによって発行されたpurchaseToken Stringを含んでいます。このIntentはprivate developer key にサインした購入サインも含んでいます。
Version 3 APIのコールについて更に学びたい場合、In-app Billing Referenceをみてください。

Consuming Items
商品のユーザの所有状態を監視するために消費メカニズム 使用することができます。


バージョン3では、全てのアプリ内商品は管理されています。これは全てのアイテム購入のユーザの所有がGoogle Playによって保持されていることを意味します。そしてアプリ側は必要なときにユーザの購入情報を検索することができます。ユーザがアイテムの購入に成功したとき、その購入情報はGoogle Playに記録されます。一旦アイテムが購入されると、それは所有された("owned") 状態と見なされます。"owned"状態のアイテムはGoogle Play から購入することはできません。 Google Playが再び購入を可能にする前に、"owned"アイテムの消費リクエストを送らなければいけません。アイテムを消費するということは、非所有("unwoned")状態に戻り、前の購入データを破棄するということです。

ユーザの所有している商品リストを検索するには、アプリ側はgetPurchasesコールをGoogle Playに送ることができます。アプリ側はconsumePurchaseコールを送ることによって消費リクエストを作ることができます。リクエストの中で、購入時にGoogle Playから手に入れたアイテムの固有のpurchaseToken Stringを明確にしなければいけません。消費の登録に成功したら、Google Playはステータスコードを返します。

Non-consumable and consumable items

アプリ内商品を消費アイテムにするか非消費アイテムにするかは、あなた自身で決められます。

Non-consumable items
通常、アプリ内で一度だけ購入することができ、永続してベネフィットを提供するアイテムなので消費を実装をする必要はありません。一度購入したら、アイテムはユーザのGoogleアカウントに関連づけられます。非消費アイテムの例としてはプレミアムアップグレードやレベルパックなどです。

Consumable items
何度も購入することができるアイテムで消費を実装することができます。通常これらのアイテムは一時的な効果を提供します。例えば、ユーザのゲーム内でのキャラクターがライフポイントを得るためや、ゴールドコインを手に入れるなどです。アプリの中で購入したアイテムのベネフィットや効果を施すことは、商品をプロビジョニングするといいます。どのように商品がユーザに提供されるのか、開発者は、それを管理し記録する責任があります。
重要:アプリの中で消費アイテムをプロビジョニングする前に、Google Playに消費リクエストを送り、消費が記録されたことを指し示すレスポンスを受け取らなければいけません。

Managing consumable purchases in your application
消費アイテムを購入するための基本的な流れは以下のとおりです。

  1. getBuyIntentコールで購入フローを始めます。
  2. 購入が完全に成功したかどうかを示すBundleをGoogle Playから受け取ります。
  3. 購入が成功したら、consumePurchaseコールを作ることによって、購入を消費することができます。
  4. 消費が成功したかどうかを示す返答コードをGoogle Playから得ます。
  5. もし消費が成功したら、アプリの中で商品をプロビジョンします。
その後、ユーザがアプリをスタートアップもしくはログインするときには、ユーザが未処理の消費アイテムを所有しているかどうか確認しなければいけません。その場合、それらのアイテムの消費とプロビジョンが出来ているかを確認してください。ここではアプリの中で消費アイテムを実装するための推奨されたアプリのスタートアップの流れです。

  1. ユーザが所有しているアイテムを検索するためにgetPurchases リクエストを送ります。
  2. 何か消費アイテムがあったら、consumePurchaseを呼ぶことによってアイテムを消費します。消費アイテムの購入オーダが完了していて、しかし、消費リクエストを送る機会を持つ前に、ストップしてしまったりアクセスが切られてしまう場合があるので、このプロセスは必要です。
  3. 消費が完了したかどうかを示すレスポンスコードをGoogle Playから得ます。
  4. 消費が成功したら、アプリの中の商品をプレビジョンします。
Local Caching
Google playクライアントが、ディバイス上にin-appBilling情報をキャッシュすることができるので、更に頻繁にこれらの情報を検索するのに、例えば、getPurchasesコールを通して、Version3 APIを使うことができます。前のバージョンのAPIとは違い、Version 3 APIのコールは、Google Playに繋ぐネットワークコネクションの代わりにAPIの返答時間を十分にスピードアプしたキャッシュ検索を通して提供されます。

2012年12月22日土曜日

アプリ内課金概要 (In-app Billing Overview for Android)

Android DevelopersのIn-appBilling Overviewのページを訳しました。
アプリ内課金のバージョン2と3の違いとそれぞれの商品タイプについて説明されています。今後バージョン3での開発を勧めています。

アプリ内課金概要 (In-app Billing Overview)
ここでは、アプリ内にアプリ内課金(In-app Billing)を加えるために理解しておくべき、基本的なアプリ内課金の概念と特徴について説明します。

In-app Billing API

アプリはディバイスにインストールされているGoogle PlayアプリにあるAPIを使ってアプリ内課金サービスにアクセスします。Google PlayアプリはアプリとGoogle Playサーバ間の課金リクエスト(billing requests)とレスポンス(billing responses)を送ります。実際に、アプリはGoogle Playサーバと直接コミュニケーションを取ることはありません。代わりにアプリは課金リクエストをプロセス間通信によってGoogle Playアプリに送り、Google Playアプリからレスポンスを受け取ります。アプリはGoogle Play サーバ間のネットワーク通信の管理は一切しません。

アプリ内課金はGoogle Playで公開されたアプリにのみ実装することができます。アプリ内購入リクエスト( in-app purchase requests)を完了するために、Google PlayアプリはGoogle Playサーバにネットワークを通してアクセスする必要があります。


現在、Google Playはアプリ内課金APIに関して2つのバージョンを提供しています。どちらのバージョンを使うかはMigration Considerationsを参照してください。


Version 3 (Recommended)

  • Google Playからのプロダクト詳細のリクエスト、プロダクトのオーダー、ユーザのプロダクト所有に基づいたアイテムの復元などを簡単に行うため、簡素化されたAPIを通してリクエストは送られる。
  • オーダー情報は購入完了をディバイスに同期的に伝える。
  • 全ての購入は管理("managed")される。(Google Playはアプリ内プロダクトのユーザの所有を管理している。)ユーザはアプリ内アイテムのコピーを複数所有することはできない。いずれの時点でも1つのコピーだけ所有することができる。
  • 購入されたアイテムは消費することができる。消費された場合、そのアイテムは非所有状態("unowned")に戻り、Google Playから再び購入することができる。

Version 2

  • リクエストは単体APIインタフェース(sendBillingRequest)を通して送られる。
  • Google Playからのレスポンスは非同期で、Broadcast Intentの形で行われる。
  • 消費モデルは提供されない。自身で実装しなければいけません。
  • 非管理アプリ内購入アイテム (unmanaged)を管理アプリ内購入アイテム (managed) と同様サポートしている。
どちらのバージョンも幅広いAndroid端末に互換性があります。アプリ内課金Version 3はGoogle Play ストアーの最新バージョンが搭載されているAndroid 2.2以上を搭載の機種をサポートしています。Version 2も同じように互換性があります。詳細はVersion Notesを見てください。

In-app Products

アプリ内プロダクトはアプリ内からユーザに販売するために提供するデジタル商品です。デジタル商品の例は、ゲーム内の通貨、ユーザの経験を強化するアプリのアップグレード、新しいコンテンツなどが含まれます。

デジタルコンテンツを売ることだけにアプリ内課金を使うことができます。物理的商品、個人的サービス、物理的な配送を要求すものを売るためにアプリ内課金を使用することはできません。有料アプリとは違い、ユーザがアプリ内プロダクトを一度購入すると払い戻し画面は表示されません。


Google Playはコンテンツ配信の形で提供はしません。開発者にはアプリの中で売るデジタルコンテンツを配信する責任があります。アプリ内プロダクトは1つのアプリのみ明確に関連づけられています。たとえ同じ開発元であっても、他のアプリで発行されたアプリ内プロダクトを購入することはできません。


Product types

アプリの収益化の仕方に柔軟性を持たせるために、アプリ内課金は異なる商品タイプをサポートしています。全ての場合において、Google Play Developer Consoleを使って製品を定義することができます。

管理商品(managed)、非管理商品(unmanaged)、定期購買商品(subscriptions)の商品タイプをアプリ内課金で指定することができます。管理("managed")とは
Google Play がユーザのアカウントを元にアプリ内商品の所有情報を管理し記録することを示しています。一方非管理("unmanaged")とは、開発者自身で所有情報を管理しなければいけません。

APIバージョンの違いによる製品のタイプのサポートについて更に知りたい場合、以下の資料を見てください。Version2, Version3


Google Play Developer Console

Developer Consoleではアプリ内課金を実装したアプリを公開し、そのアプリから購入できる様々な商品を管理することが出来ます。

1度のみの購入や定期購入の自動更新といったアイテムを含む、
アプリに関連したデジタル商品のリストを作ることができます。各アイテムに対し、ユニーク商品ID (SKU),商品タイプ、値段、説明、商品の購入履歴をGoogle Playが管理をすべきかなどの情報を定義することができます。

また非公開のテストアプリにアクセス許可を持たせたテストアカウントを作ることができます。


商品や商品リストの設定に関してDeveloper Consoleの使い方を学ぶには、Administering in_app Billingを見て下さい。


Google Play Purchase Flow

Google Playはアプリ購入に使われるバックエンド精算サービスを使用するので、ユーザにとって一貫性のある親しみやすい購入の流れになっています。

重要:Google Play上でアプリ内課金サービスを使用する
にはGoogle Checkout Merchant のアカウントを持たなければいけません。

購入を開始するために、アプリは特有のアプリ内商品の課金リクエストを送ります。google Playは支払い形式のリクエストや認証、
ファイナンシャル取引の処理などを含む取引に関する精算の詳細をすべて管理します。

精算処理が完了すると、Google Playは注文番号、注文日時、そして支払いなどの購入の詳細をアプリに送ります。アプリはファイナンシャル取引を管理する必要はありません。それはGoogle Playによって提供されます。


The Sample Applications

アプリにアプリ内課金を統合する手助けとして、Android SDKはアプリ内で商品を売るための方法をデモした、2つのサンプルアプリを提供しています。

TrivialDrive sample for the Version 3 API

このサンプルはドライブゲームで商品購入を実装し、アプリ内課金 Version 3 APIの使い方を示しています。このアプリはアプリ内課金のレクエストの送り方、Google Playからの同期したレスポンスの管理の仕方をデモしています。また、APIを使ったアイテムの消費の記録の仕方なども紹介しています。Version 3のサンプルはアプリ内課金処理の方法と同様に自動署名認証の仕方も含まれています。

Dungeons sample for the version 2 API

このサンプルはアドベンチャーゲームのための商品と定期購買を販売するためのアプリない課金 Version 2 APIの使い方をデモしています。またデータベース、ユーザインタフェースそしてアプリ内課金の実装に使える基本的ロジックを含んでいます。

重要:アプリを公開する前にアプリのコードを難読化することを進めます。詳細情報は

Security and Designを見てください。

Migration Considerations

アプリ内課金を含んだアプリを新しく作る際やVersion 2 やそれよりも前のAPIからVersion 3のAPIにアプリ内課金の実装を移行する際に考慮するべきことは以下のとおりです。

Google PlayはVersion2とVersion3 APIどちらも同時にサポートを続ける予定です。自身のペースでVersion3に移行してください。アプリ内課金 Version 2のサポート状態の変更はGoogle Play チームから前もってお知らせします。

必要性によってどちらのAPIのバージョンを使えばいいか以下のテーブルを参照してください。
Table 1. Selecting the In-app Billing API Version for Your Project

Choose Version 3 if ...
  • You want to sell in-app products only (and not subscriptions)
  • You need synchronous order confirmations when purchases complete
  • You need to synchronously restore a user's current purchases
Choose Version 2 if ...

  • You want to sell subscriptions in your app


もし、アプリ内で商品を売っているアプリを既に公開している場合以下に注意してください。


  • Developer Consoleで前持って定義した管理アイテム("managed items")はVersion 3で使用できます。
  • Version 3 APIを使ってアイテムの購入リクエストを行う場合、既存アプリで非管理アイテム("unmanaged items")と定義されているものは管理アイテム("managed items")として扱われます。このアイテムのためにDeveloper Consoleに新しいプロダクトを作る必要はありません。このアイテムの購入のために同じプロダクトIDを使用することができます。Version2 もしくはその前のAIPを使ってその購入リクエストを作る場合、非管理アイテム("unmanaged items")としてそのまま扱われます。

2012年11月20日火曜日

Facebook SDK for Android v3.0 を試す

Getting Started with the Facebook SDK for Android v3.0

Android用Facebook SDKはFacebookプラットフォームを最も簡単にAndroidアプリに統合することができます。SDKはFacebookのLogin認証、Facebook APIへのread/write、またピッカーUI(pickers)やダイアログのようなUI部品をサポートしています。
Android用Facebook SDKの開発を始めるため、以下のステップに沿って行いましょう。このガイドラインで使用しているスクリーンショットはApple OS X 環境のものですが、Windowsへのインストールのステップも殆ど同じ手順で行うことができます。手順が異なる部分はハイライトされています。

1. 必要なものをインストール(省略)

Eclipse(少なくともAndroidの開発に必要な開発環境はEclipse Classic), Android SDK, ADT Pluginが必要です。
Facebook SDKを使用するために、ここではAndroid 2.2(API 8)のインストールが必要です。

2. Android用のFacebook SDKとFacebook APKのインストール(省略)

Installationパッケージをダウンロードし展開。エミュレータにFacebookアプリをインストール。

Facebookのネイティブアプリ(公式アプリ)がインストールされている場合、Facebook SDKは認証をサポートするのにネイティブアプリを使用します。実機上では、このテストを行うのに、Google Playから無料でこのアプリをインストールすることができます。

インストールされたFacebookアプリのAPKはSDKのbinフォルダーにある、FBAndroid-1.9.9.apkとなっています。

(エミューレータへのインストールは省略)


3. EclipseにFacebook SDKをインポート

サンプルプログラムと一緒に、ワークスペースにlibraryプロジェクトとしてFacebook SDKを追加。
InstallationフォルダはSDKプロジェクトであるfacebookディレクトリに含まれています。サンプルプロジェクトはsamplesフォルダに含まれています。

空のワークスペースに全てのプロジェクトを一気にインポートすることができます。このときワークスペースに古いfacebookプロジェクトがないことを確認してください。もし古いものが存在していると、古いFacebook SDKを参照してしまう可能性があるので、古いものを削除するかワークスペースを変更してください。

新しいFacebook SDKと一緒にSDK Libraryプロジェクトとサンプルをインポートするには、Eclipseの 'File' > 'Import' で 'General' / 'Existing Projects into Workspace'を選択してください。
SDKフォルダのルートであるfacebook-android-ask-3.0.1.bを選択します。全てのサンプルプログラムが表示されるので、'FacebookSDK'が含まれていることを確認してください。
'Copy projects into workspace'オプションを外すことで、隣接するSDKに対し各サンプルプロジェクトは正しい参照を保持します。これはEclipseSDK installationの中にプロジェクトのコピーではなくリンクを張ることを意味します。

(もし将来SKD in-placeをアップデートし、結果的にワークスペースのLibraryプロジェクトをアップデートするときにこのプションが役立ちます。ですが将来SDKサンプルを編集するとなると、オリジナルバージョンに影響しないようにコピーを後に再インポートしなければいけなくなります。)

'Finish' をクリックします。もしサンプルプロジェクトにエラーが表示されたら、Eclipseの 'Project' > 'Clearn' で全てのプロジェクトの状態をリフレッシュしてください。



EclipseコンパイラのレベルがAndroidによって要求されたものに一致しない可能性があります。もし、'Android requires compiler compliance level 5.0 or 6.0'というエラーが出たら、'Java Compiler' のプロジェクトプロパティがv1.6になっているか確認してください。


これでサンプルアプリを動かすことができます。いくつかのサンプルを動かすためにFacebookAndroid key hashを準備する必要があります。手順は次のステップで紹介します。


4. サンプルプログラムを動かす(省略)


サンプルプロジェクトを試し、Facebook プロファイルにAndroid key hashを入力。


各サンプルプロジェクトはSDKの重要な部分とソーシャルアプリの構築のためのテクニックを示しています。

基本サンプル
  • ProfilePictureSample
  • FriendPickerSample
  • PlacePickerSample

機能サンプル
  • SessionLoginSample
  • JustRequestSample
  • BooleanOGSample
  • SwitchUserSample

完成サンプル
  • HelloFacebookSample
  • Scrumptious
  • Hackbook
これらのサンプルは前のステップでインポートしたワークスペースに置きます。各サンプルが隣接する'FacebookSDK'ライブラリを正しく参照している必要があります。

サンプルプロジェクトを選択し、Eclipseの'Run'を実行します。初めて行う際には、以下のダイアログが表示されます。

'Android Application'を選択するとAndroid エミュレータがスタートし、選択したサンプルが表示されます。

ProfilePictureSampleのようなとても単純なアプリは即座に実行されます。もし、認証を含んだサンプルを実行したい場合、更にFacebookにAndroid key hashを提供するための設定を行う必要があります。

簡単に言うと作成した各Androidアプリは署名が必要であり、後に説明しますが、認証のためのセキュリティチェックとしてFacebookに各アプリのkey hashを登録する必要があります。SDKサンプルではこのチェックを回避して簡単に実行するために、Facebook Developerプロファイルにアプリのkey hashを入力することができます。

まずパソコン上でkey hashを生成するために、Javaのkeytool utilityを実行します。(Androidのdebug keysotreではなくコンソールのパスにします。)


OS Xでの実装:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
Windowsでの実装:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64
パスワードを聞かれるので、ここではandroidとします。30文字くらいのkey hashを得ることができます。(もしパスワードを聞かれなかったら何かが間違っているので、debug.keystoreが上記のパスに存在しているか確認してください。)


公開するアプリでは、debug.keystoreではなく自分のアプリの署名に使用したkey hash(xxx.keystore)を使用します。(xxxはaliasを示す) パスワードは自分で設定したxxx.keystoreのパスワードを入力する必要があります。 
keytool -exportcert -alias xxx -keystore /keystoreまでのパス/xxx.keystore | openssl sha1 -binary | openssl base64

最後にFacebook Developer siteに行きます。Loginされているか確認し、画面右上にあるメニューから'Setting'を選択します。


画面左の'Developer Settings'に行きます。もし、developerの登録をしていなければ登録を要求されます。

プロファイルにKey hashを登録し保存します。

 
(複数のパソコンで開発を行っている場合は複数のkey hashを登録することができます。)
これで、問題なくエミュレータで全ての基本的な認証サンプルプログラムを動かすことができるはずです。


5. Facebookアプリを作る


新しいFacebookアプリを作り、そのIDとAndroid key hashの関連づけ。

Facebook Developers サイトのApp Dashboardに戻ります。'Create New App'をクリックし、基本情報としてアプリ名やnamespaceを入力します。


一端作成すると、dasyuboradのトップにアプリのIDが表示されます。後にプロジェクトファイルにこのIDを加える必要があります。




既に存在しているアプリのIDももちろん使えることが出来ます。

いずれにしても、アプリにAndroid key hash を関連づける必要があります。'Edit App'をクリックし、dashboardの下の方にある'Native Android App'セクションを開きます。keytoolアプリで前のステップの最後に手に入れたkey hashを加えます。



変更を保存します。

このdashboradに戻り、アプリのパッケージ名と新しく作成したAndroidプロジェクトのmain activity classを登録する必要があります。

6. Facebook Loginの新しいAndroidプロジェクトを作る




Facebook SDKにリンクした新しいプロジェクトの作成。Facebook Loginとユーザ名の取得のデモ。

この最後のステップで、新しいプロジェクトを作り、Facebook Loginのデモに必要な最低限のコードを加えます。

新しいAndroid project の作成
Eclipseに新しいAndroid アプリのプロジェクトを作成するには、File>New>Project…で'Android Application Project'を選択します。
 
Facebookのアプリを登録したときに、使用したアプリ名とNamespaceを使う必要はありませんが、ここでは統一するために用います。アプリにアイコンを選択することができます。
 
次に、アプリのmain activityを作成します。この例では、基本的なユーザインタフェースを持つシンプルなBlankActivityを選択します。
最後に、Activityの名前を入力します。レイアウト名がactivity_mainとなるデフォルトのMainActicityとして保存します。


Finishをクリックし、新しいプロジェクトがmain activity classと一緒に作られます。


パッケージ名とActicityFacebookに登録
この時点で、Facebook DeveloperサイトのApp Dashboardに戻り、Androidの設定部分Android アプリのパッケージとActivity名を入力します。またFacebook LoginEnabledにします。




SDKプロジェクトのリンクとFacebook アプリIDの設定

Eclipseに戻り、SDK libraryプロジェクトと新しいアプリをリンクさせます。プロジェクトのPropertiesを開きAndroidを選びます。ダイアログの下の方にある'Add'を選択し、FacebookSDKプロジェクトをworkspaceから選択します。

プロジェクトの中にFacebook app IDを加えるには、プロジェクトのres/valuesフォルダのstrings.xmlを開きます。前のステップで手に入れたIDをString型のapp_idに加える必要があります。

(string.xmlファイルを見てみると、ドキュメントの中に
<string name="app_id">497906953566757</string>
という内容が書き込まれているはずです。)

続いてプロジェクトのルーツの中のAndroidManifest.xmlを開きます。android.permission.INTERNET:という'uses permission'を加えます。


また、'Application' タブでは、先ほど設定したstring型app_idを持った com.facebook.sdk.ApplicationIDと呼ばれるmeta-data itemを加える。

最後にアプリにcom.facebook.LoginActivityという名前で新しいActivityを加えます。

(ソースファイルを見てみると、以下のようなXMLに新しいコードが加わっているはずです。)
<uses-permission android:name="android.permission.INTERNET"/> 
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
<activity android:name="com.facebook.LoginActivity">


最低限実行可能なソーシャルアプリ
最初にこのプロジェクトを作成すると、res/layout にある activity_main.xmlで単純なユーザインタフェースが作成されます。そのファイルを開き、設計画面の真ん中でtext labelを選択し、@+id/welcom のIDを付けます。


レイアウトのソースコードを見ると以下のようになっているはずです。
...
<TextView
    android:id="@+id/welcome"
    android:layout_width="wrap_content"
    ...
この参照によって、ユーザがFacebookにLoginしたときに、ユーザ名を含んだwelcomeテキストがアップデートされるようにします。srcフォルダのMainActivity.javaを最後に開きます。

まず、MainActivityの親クラスをActivityからFacebookActivityに変更し、import android.app.Activitycom.facebook.FacebookActivityに変えます。

import android.app.Activity;
import com.facebook.FacebookActivity;

public class MainActivity extends Activity {
public class MainActivity extends FacebookActivity {
...
次にonCreateメソッドの最後に、Facebook loginを開始するためのthis.openSession()を呼びます。
@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.openSession();
}
一端ユーザがLoginすると、activityのonSessionStateChangeメソッドが呼ばれます。 ユーザ名のフェッチやwelcome メッセージのアップデートにはこのメソッドを使うことができます。以下メソッドを加えます。
@Override
protected void onSessionStateChange(SessionState state, Exception exception) {
  // user has either logged in or not ...
}
このコールバックの中で、オープンセッションを作成するためにユーザがLoginしているかチェックし、ユーザの基本情報をフェッチするためのFacebook Graph API の /me endpointのコールを作る必要があります。onCompletedと呼ばれるコールバックを持つRequest.newMeRequest(Session, Callback)でリクエストを作ることによってこれを行います。
この中で、ユーザ名と一緒にTextViewのラベル(先ほどwelcome IDとしたもの)を置き換えます。設定したリクエストを実行することによってこのメソッドを完成させます。

@Override
protected void onSessionStateChange(SessionState state, Exception exception) {
  // user has either logged in or not ...
  if (state.isOpened()) {
    // make request to the /me API
    Request request = Request.newMeRequest(
      this.getSession(),
      new Request.GraphUserCallback() {
        // callback after Graph API response with user object
        @Override
        public void onCompleted(GraphUser user, Response response) {
          if (user != null) {
            TextView welcome = (TextView) findViewById(R.id.welcome);
            welcome.setText("Hello " + user.getName() + "!");
          }
        }
      }
    );
    Request.executeBatchAsync(request);
  }
}
この抜粋はFacebook SDK(TextView widget classを含む)から追加した多くのクラスを使うので追加のimport宣言が必要になります。

import com.facebook.GraphUser;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.SessionState;
import android.widget.TextView;
全てのファイルを保存して実行します。アプリはすぐにFacebook Login flowを始めます。( もしエミュレータにAPKがインストールされていればFacebook アプリを通して行われます。もしされていなければウェブダイアログを通して行われます。) Loginが成功するとユーザ名が表示されます。






これでソーシャルAndroidアプリを構築することができました。Facebook SDKを更に深く理解し、追求する準備が整いました。
最後にMainActivity.javaの完成コードは以下のとおりです。


package com.firstandroidapp;

import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;
import com.facebook.FacebookActivity;
import com.facebook.GraphUser;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.SessionState;

public class MainActivity extends FacebookActivity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      this.openSession();
  }

  @Override
  protected void onSessionStateChange(SessionState state, Exception exception) {
    // user has either logged in or not ...
    if (state.isOpened()) {
    // make request to the /me API
      Request request = Request.newMeRequest(this.getSession(), new Request.GraphUserCallback() {
        // callback after Graph API response with user object
        @Override
        public void onCompleted(GraphUser user, Response response) {
          if (user != null) {
            TextView welcome = (TextView) findViewById(R.id.welcome);
            welcome.setText("Hello " + user.getName() + "!");
          }
        }
      });
      Request.executeBatchAsync(request);
    }
  }

}

2012年8月4日土曜日

[Android]ディスプレイサイズの取得(API Level14以降)

Android端末のディスプレイサイズの取得にはDisplayクラスを使用します。
API Level14以降にDisplay.getWidth()/getHeight()を使用するとDeprecatedの警告が表示されてしまいます。これを回避するには以下の対策があります。

[対策]

 Display display = getWindowManager().getDefaultDisplay();
        if (  Integer.valueOf(android.os.Build.VERSION.SDK_INT) < 13 ) {
         displayW = display.getWidth();
         displayH = display.getHeight();
          } else {
            Point size = new Point();
            display.getSize(size);
            displayW = size.x;
            displayH = size.y;
          }


API Level 14以降
  • Display.getSize()で画面サイズを取得

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

API Level 13まで
  • Display.getWidth()/getHeight()で画面サイズを取得

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
displayW = display.getWidth();
displayH = display.getHeight();

2012年7月28日土曜日

[Android] Media Volume (メディアの音量)

Androidのボリュームボタンは通常、着信音量の設定になっています。
メディアの音量を変える場合には、メディアを流しているときにボリュームボタンで変えることができます。各ActivityのonCreateに以下を加えると、常にボリュームボタンをメディアの音量に設定することができます。

setVolumeControlStream(AudioManager.STREAM_MUSIC);