引っ越しました
2013年8月27日火曜日
2013年8月4日日曜日
Google Play Game Servicesに自分のアプリを対応する
今年に入って、Googleが、ゲームのランキングや達成(アチーブメント)などを管理するAPIを公開してくださったようです。
Google Play Game Services - Take your games to the next level
https://developers.google.com/games/services/
嬉しいっ!
過去にも(今でも)こんなサービスやってる会社がいくつかありましたが、どっかに統合されたり、広告が出たりいろいろ問題ありました。
天下のGoogleが無料でこれを公開してくれれば鬼に金棒です。
そういうわけで、早速組み込みを行いました。
「論よりRUN(プログラムを実行)」といいます。(・・と最近は言いませんが)
まずはサンプルの実行です。
https://developers.google.com/games/services/android/quickstart
これは、それほど問題もなくできました。
基本的に英語力だけはそれなりに求められますが、最近は日本語の情報もあちこちあるので、そちらに譲るとします。
でも、、、
これを自分のアプリケーションに組み込むとなると、話は別でした。
Google Play Game Servicesに、自分のアプリケーションを対応させるのは、私はそれなりに苦労しました。
基本的なやりかたは、以下の通りなんです。
組み込み手順(英語)
Initializing Your Games Client in Android
https://developers.google.com/games/services/android/init
で、この通りやったのですが、なかなかうまくいきません。
自分のアプリの MainActivity.java の継承元クラスをActivity から BaseGameActivityクラスに変更するだけで、アプリの起動ができなくなってしまいます。
私は少しずつ修正して問題ないのを確認しながら進めていくタイプなので、ここで止まっていたのですが、他の設定を行わなければ起動できないという状況は改善されないことが、あとになってわかりました。
私の場合は、Google Play Game Services をEclipseにインストールした際、各種ライブラリがアップグレードされ、既存アプリのライブラリのバージョンの不一致による問題と、xmlファイルの設定不足が足かせだったみたいです。
私と同じようにうまくいかない方は、以下を参考に、ひとつずつ確認してみることをオススメします。
ほとんど自分用のメモですが、参考になれば幸いです。
■ビルドパスの調整
Eclipse パッケージエクスプローラで、自分のアプリのプロジェクトを
右クリック - プロパティ - Android
画面下部の「ライブラリ」に google-play-services、 BaseGameUtils を追加
(Is Libraryにチェックをつけない)
■MainActivity.java に importを追加
import com.google.example.games.basegameutils.BaseGameActivity;
■MainActivity に、参照するクラスを追加
// 継承クラスを変更
before : public class MainActivity extends Activity
after : public class MainActivity extends BaseGameActivity {
■必須メソッドの自動生成
■以下メソッドも追加
■AndroidManifest.xml の修正
application セクション内
<meta-data android:name="com.google.android.gms.games.APP_ID"
android:value="@string/app_id" />
■ids.xml を記載(そういえば、私はこのファイルを今回初めて作りました)
app_id(Developer Consoleで確認) を、ids.xml に記載します。
その他、必要な値を設定します。
TypeANumberをコピーしてきて修正するのがオススメです。
values\ids.xml を準備
<string name="app_id">789779522XXX</string>
■android-support-v4.jar の最新化
既存のアプリに Google Play Game Services を組み込む場合、ライブラリのバージョンが上がっている場合があります。
その場合、ライブラリを新しくする必要があります。
私の場合、android-support-v4.jar が新しくなっていたので上書きコピー。
■レイアウトにログイン・ログアウトボタンを追加
これも TypeANumberを参考にするのがオススメです。
<!-- sign-in button -->
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- sign-out button -->
<Button
android:id="@+id/sign_out_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign Out"
android:visibility="gone" />
■■■
ここまでで、ビルド・実行して、今までの処理が問題なく動くことを確認します。
動いたら、Developer Console の ゲームサービスから、自分のアプリを登録します。
登録の手順は、やっぱり TypeANumberを参考に。
そして、ようやくメインの処理の追記に入ります。
■スコア送信処理の追加
myLeaderBoard_ID : Developer Console の ゲームサービスで登録したときに取得したリーダーボードのID
myScore : 送信したい点数
■リーダーズボードの表示処理
健闘を祈ります!
蛇足ですが、
私の場合は、project.propertiesも調整しました。手動編集しちゃいけないっぽかったですが、TypeANumberが動いたときの設定と比較した結果、差異があったので、直しちゃいました。
【修正前】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=../BaseGameUtils
【修正後】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=..\\BaseGameUtils
Google Play Game Services - Take your games to the next level
https://developers.google.com/games/services/
嬉しいっ!
過去にも(今でも)こんなサービスやってる会社がいくつかありましたが、どっかに統合されたり、広告が出たりいろいろ問題ありました。
天下のGoogleが無料でこれを公開してくれれば鬼に金棒です。
そういうわけで、早速組み込みを行いました。
「論よりRUN(プログラムを実行)」といいます。(・・と最近は言いませんが)
まずはサンプルの実行です。
https://developers.google.com/games/services/android/quickstart
これは、それほど問題もなくできました。
基本的に英語力だけはそれなりに求められますが、最近は日本語の情報もあちこちあるので、そちらに譲るとします。
でも、、、
これを自分のアプリケーションに組み込むとなると、話は別でした。
Google Play Game Servicesに、自分のアプリケーションを対応させるのは、私はそれなりに苦労しました。
基本的なやりかたは、以下の通りなんです。
組み込み手順(英語)
Initializing Your Games Client in Android
https://developers.google.com/games/services/android/init
で、この通りやったのですが、なかなかうまくいきません。
自分のアプリの MainActivity.java の継承元クラスをActivity から BaseGameActivityクラスに変更するだけで、アプリの起動ができなくなってしまいます。
私は少しずつ修正して問題ないのを確認しながら進めていくタイプなので、ここで止まっていたのですが、他の設定を行わなければ起動できないという状況は改善されないことが、あとになってわかりました。
私の場合は、Google Play Game Services をEclipseにインストールした際、各種ライブラリがアップグレードされ、既存アプリのライブラリのバージョンの不一致による問題と、xmlファイルの設定不足が足かせだったみたいです。
私と同じようにうまくいかない方は、以下を参考に、ひとつずつ確認してみることをオススメします。
ほとんど自分用のメモですが、参考になれば幸いです。
■ビルドパスの調整
Eclipse パッケージエクスプローラで、自分のアプリのプロジェクトを
右クリック - プロパティ - Android
画面下部の「ライブラリ」に google-play-services、 BaseGameUtils を追加
(Is Libraryにチェックをつけない)
■MainActivity.java に importを追加
import com.google.example.games.basegameutils.BaseGameActivity;
■MainActivity に、参照するクラスを追加
// 継承クラスを変更
before : public class MainActivity extends Activity
after : public class MainActivity extends BaseGameActivity {
■必須メソッドの自動生成
- @Override
- public void onSignInFailed() {
- // TODO Auto-generated method stub
- }
- @Override
- public void onSignInSucceeded() {
- // TODO Auto-generated method stub
- }
■以下メソッドも追加
- // サインインチェック処理
- protected boolean isSignedIn() {
- return mHelper.isSignedIn();
- }
- // googleサインインボタン押下時
- @Override
- public void onSignInButtonClicked() {
- // start the sign-in flow
- beginUserInitiatedSignIn(); // サイン・イン
- }
- // googleサインアウトボタン押下時
- @Override
- public void onSignOutButtonClicked() {
- signOut(); // サインアウト
- }
- // ゲームクライアント取得
- protected GamesClient getGamesClient() {
- return mHelper.getGamesClient();
- }
- // 順位表示ボタン押下時処理
- @Override
- public void onShowLeaderboardsRequested() {
- if (isSignedIn()) {
- startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
- } else {
- showAlert(getString(R.string.leaderboards_not_available));
- }
- }
- // 達成度表示ボタン押下時処理
- @Override
- public void onShowAchievementsRequested() {
- if (isSignedIn()) {
- startActivityForResult(getGamesClient().getAchievementsIntent(), RC_UNUSED);
- } else {
- showAlert(getString(R.string.achievements_not_available));
- }
- }
■AndroidManifest.xml の修正
application セクション内
<meta-data android:name="com.google.android.gms.games.APP_ID"
android:value="@string/app_id" />
■ids.xml を記載(そういえば、私はこのファイルを今回初めて作りました)
app_id(Developer Consoleで確認) を、ids.xml に記載します。
その他、必要な値を設定します。
TypeANumberをコピーしてきて修正するのがオススメです。
values\ids.xml を準備
<string name="app_id">789779522XXX</string>
■android-support-v4.jar の最新化
既存のアプリに Google Play Game Services を組み込む場合、ライブラリのバージョンが上がっている場合があります。
その場合、ライブラリを新しくする必要があります。
私の場合、android-support-v4.jar が新しくなっていたので上書きコピー。
■レイアウトにログイン・ログアウトボタンを追加
これも TypeANumberを参考にするのがオススメです。
<!-- sign-in button -->
<com.google.android.gms.common.SignInButton
android:id="@+id/sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<!-- sign-out button -->
<Button
android:id="@+id/sign_out_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sign Out"
android:visibility="gone" />
■■■
ここまでで、ビルド・実行して、今までの処理が問題なく動くことを確認します。
動いたら、Developer Console の ゲームサービスから、自分のアプリを登録します。
登録の手順は、やっぱり TypeANumberを参考に。
そして、ようやくメインの処理の追記に入ります。
■スコア送信処理の追加
myLeaderBoard_ID : Developer Console の ゲームサービスで登録したときに取得したリーダーボードのID
myScore : 送信したい点数
- if (isSignedIn()) {
- getGamesClient().submitScore(myLeaderBoard_ID), myScore);
- }
■リーダーズボードの表示処理
- if (isSignedIn()) {
- startActivityForResult(getGamesClient().getAllLeaderboardsIntent(), RC_UNUSED);
- }
健闘を祈ります!
蛇足ですが、
私の場合は、project.propertiesも調整しました。手動編集しちゃいけないっぽかったですが、TypeANumberが動いたときの設定と比較した結果、差異があったので、直しちゃいました。
【修正前】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=../BaseGameUtils
【修正後】
android.library.reference.1=../google-play-services_lib
android.library.reference.2=..\\BaseGameUtils
2013年7月21日日曜日
Android開発環境を更新したら、既存のアプリが動かなくなった
ある日、過去のAndroidプロジェクトが全て動かなくなった。
最近やったことを思い返してみる・・
Androidシステム開発環境を更新したんでした。
なぜかというと、Developer Console に新しく現れた「ゲームサービス」を使ってみたいから!
テストプログラムを動かして、これまで作ったアプリに組み込みをせこせこ行おう!と思ったのです。
そのためには、開発環境をあれこれ更新しなければなりませんでした。
・・・と言っても、ほとんどEclipse任せ。
画面表示されるメッセージに言われるままに、更新を繰り返しました。
随分いろいろなライブラリやらツールが入れ替わったようです。。
ゲームサービスのサンプルは何とか動くようになったのですが、
代わりにそれまでのアプリがうごかなくなった。。
現象はこんな感じ。。
07-21 11:18:21.656: E/AndroidRuntime(23900): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.domain.app/com.kdomain.app.MainActivity}: android.view.InflateException: Binary XML file line #101: Error inflating class com.google.ads.AdView
07-21 11:18:21.656: E/AndroidRuntime(23900): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1658)
07-21 11:18:21.656: E/AndroidRuntime(23900): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)
07-21 11:18:21.656: E/AndroidRuntime(23900): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
ぐぐってみると、すぐに見つかりました。
http://stackoverflow.com/questions/10523703/error-inflating-class-com-google-ads-adview
この人と同じ現象!
でも、この人の場合は、libフォルダを新たに作って、そこにライブラリを置きましょうというのが解決策だったみたいですが、私の場合は既にあります。
・・とにかくライブラリ周りの問題と思い、あれこれ再チェック。
すると、Javaのビルドパスの設定から、GoogleAdMobAdsSdk-6.3.0.jar のチェックが外れているではありませんか!
他の動かなくなったアプリも同じでした。
チェックをつけてビルド・実行しなおしたら、動きました。
あーよかった。
どんなことでも、主原因ってたいしたことがない場合が本当に多いものですね。
最近やったことを思い返してみる・・
Androidシステム開発環境を更新したんでした。
なぜかというと、Developer Console に新しく現れた「ゲームサービス」を使ってみたいから!
テストプログラムを動かして、これまで作ったアプリに組み込みをせこせこ行おう!と思ったのです。
そのためには、開発環境をあれこれ更新しなければなりませんでした。
・・・と言っても、ほとんどEclipse任せ。
画面表示されるメッセージに言われるままに、更新を繰り返しました。
随分いろいろなライブラリやらツールが入れ替わったようです。。
ゲームサービスのサンプルは何とか動くようになったのですが、
代わりにそれまでのアプリがうごかなくなった。。
現象はこんな感じ。。
07-21 11:18:21.656: E/AndroidRuntime(23900): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.domain.app/com.kdomain.app.MainActivity}: android.view.InflateException: Binary XML file line #101: Error inflating class com.google.ads.AdView
07-21 11:18:21.656: E/AndroidRuntime(23900): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1658)
07-21 11:18:21.656: E/AndroidRuntime(23900): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1674)
07-21 11:18:21.656: E/AndroidRuntime(23900): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
ぐぐってみると、すぐに見つかりました。
http://stackoverflow.com/questions/10523703/error-inflating-class-com-google-ads-adview
この人と同じ現象!
でも、この人の場合は、libフォルダを新たに作って、そこにライブラリを置きましょうというのが解決策だったみたいですが、私の場合は既にあります。
・・とにかくライブラリ周りの問題と思い、あれこれ再チェック。
すると、Javaのビルドパスの設定から、GoogleAdMobAdsSdk-6.3.0.jar のチェックが外れているではありませんか!
他の動かなくなったアプリも同じでした。
チェックをつけてビルド・実行しなおしたら、動きました。
あーよかった。
どんなことでも、主原因ってたいしたことがない場合が本当に多いものですね。
2013年6月25日火曜日
JSFでDBから取得した日付が一日前になってしまう問題について
JSFのバージョンアップ対応で、なぜかDBから取得した日付情報が一日前になってしまうという不思議な現象が発生。
仕様ですか?と聞いてみると、そんなわけないだろうという回答。
うん、そりゃあそうだ。
そういうわけで早速調査。
でも、ステップ実行して調べてみるも、正しく日付を処理しているように見える。。
なぜだろう・・と思って調べてみたら、タイムゾーンの設定による問題らしい。
対処方法は2通り。
1:コンバータで日付を設定している箇所にすべてタイムゾーンの記載を追加。
(たくさんあるととても大変。。)
なので、今回は
2:Web.xml にタイムゾーンとしてシステムのタイムゾーンを使う一筆を追加。
(こっちは、一か所修正するだけで、すべてに反映可能!)
こっちを採用。
それにしても、どうしてこのパラメータ、デフォルトでオンじゃないのでしょうね。
web.xml
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
仕様ですか?と聞いてみると、そんなわけないだろうという回答。
うん、そりゃあそうだ。
そういうわけで早速調査。
でも、ステップ実行して調べてみるも、正しく日付を処理しているように見える。。
なぜだろう・・と思って調べてみたら、タイムゾーンの設定による問題らしい。
対処方法は2通り。
1:コンバータで日付を設定している箇所にすべてタイムゾーンの記載を追加。
(たくさんあるととても大変。。)
なので、今回は
2:Web.xml にタイムゾーンとしてシステムのタイムゾーンを使う一筆を追加。
(こっちは、一か所修正するだけで、すべてに反映可能!)
こっちを採用。
それにしても、どうしてこのパラメータ、デフォルトでオンじゃないのでしょうね。
web.xml
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
登録:
投稿 (Atom)