× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
参考ページは以下。
http://qiita.com/gabu/items/673288c3a5b39f89aa92 twitterのアプリケーション登録ページは以下 https://apps.twitter.com/app 基本的に参考ページのコードを書き写せば良いが、 気をつける点いくつか。 ・CallbackURLも設定する CallbackURLとは、OAuth認証が済んだ後に戻る先のURLである。 androidアプリの場合設定は不要なのだが、(コードから設定するので)何かしら書いておく必要がある。何も書いていないと、コールバック自体をしなくなってしまうため。 何でもいいから適当に書いておく マニフェストのTwitterOAuthActivityの中で、 コールバックURLをhost,schemeの形で指定する。 これが scheme://host の形でコールバックURLとして使われることになる。(スキームが先) PR |
以下のようなエラーが出た。
Unable to execute dex: Multiple dex files define ****; Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define ****; つまり、同名のファイルが複数存在していることが問題。 今回の場合、 Lcom/android/vending/billing/IInAppBillingService がmultipleだというエラー。 元々自分でこのファイルを追加していた。 android公式の課金サンプルからコピペした src/com/android/vending/billing/IInAppBillingService.aidl をプロジェクトに追加していた。 で、その後 appCCloudのjarファイルを追加したところこのエラー。 appCCloudには課金機能も含まれているので、jar内にIInAppBillingServiceクラスの定義があったのだろう。 ◯対処 そこで、自分でファイル追加していたsrc/以下のaidlファイルを削除。 aidlはインターフェース定義だけなので、実体は元々別にあるものなので ここで削除しても問題ないはず。 で、やってみたらエラーが消えた。 |
大前提
google play developer console と google developers console は別物。 とても紛らわしい google play developer console https://play.google.com/ google developers console https://console.developers.google.com/ 0. google play developer consoleで、アプリを作成 これは済んでいる前提。 アプリ名もストアに並ぶものそのままで書いている。 1. google developers consoleで、プロジェクトを作成。プロジェクト名はアプリ名と同じが良いだろう。ただし英数字しか使えない 2. PUSH通知サービスを有効にする。 左タブ「APIと認証」を選択→APIを選択→「Google Cloud Messaging for Android」を有効にする 3. 左タブ「APIと認証」→認証情報から、「公開 API へのアクセス」の「新しいキーを作成」をクリック。 テスト用にIPアドレスは 「0.0.0.0/0」としておく。 すると、「API キー」が発行される。 4. google play developer console に移動 5. アプリの「サービスとAPI」を選択→「GOOGLE クラウド メッセージング(GCM)」を作成。 先ほどの「APIキー」を入力。 すると「リンクしている送信者ID」が作成される (appCCloud使用の場合は不要の手順) appCCloudの場合 1. google developers consoleのみ使用。 appCCloudの管理画面に行き APIキーに「APIキー」を、 SenderIDに「プロジェクトID」(consoleの「概要」タブから確認)を入力 2. appc_cloud_x.x.x.jarファイルをプロジェクトに追加 3. AndroidManifest.xmlにappCCloud周りの必要事項を追記。 管理画面に書き方参考があるので、それを見てそのまま追記すればよい 4. コード記述。 MainActivity.javaに以下の3行を追記するだけ
5. 一度実機で起動。 アプリ起動のタイミングでデバイスがpush対象として登録される。 6. 管理画面からpush送信予約をする 7. 待つ。5分前後。 端末がpush通知受け取れる設定になってるか確認 8. 届けば成功 注意点 android-support-v4.jarが必要。エラーにはならないが実行時にワーニングが出る |
ご多分に漏れずいろいろ罠がある。
1. AndroidManifest.xmlに課金のパーミッション追加
2. この状態でまずapkを一度作る。(課金部分は実装していなくてよい) 3. 作ったapkをgoogle play developer console から、ベータ版としてアップロード なぜかというと、課金パーミッション付きのapkをアップロードしないと、商品の登録ができないからだ。 4. 課金アイテム他、各種情報を記入。 すべてを記入。 課金アイテムについて。 これは見れば分かる。 「有効」にするのを忘れずに。 プロダクトID(SKUとも言う)はアプリ内でユニークであればよい。なお大文字アルファベットは使えない。 一度使ったIDは、その後二度と使えなくなるので注意。 すべて記入を済ますことで、アプリのベータ公開ができるようになる。 5. ベータ版を公開する ここが必須!(これに気付かず数時間無駄にした) 公開していないと、この後課金処理を動かしたときに課金アイテム情報が取得できない。 ベータ版を公開しても、google playに公開される訳ではないので安心しよう。(google+でグループに招待したメンバーにだけ見えるようになる。その方法はここでは関係ないので触れない。) 公開には時間がかかる。consoleで「公開済み」の表示が出るまで待とう(数十分〜数時間) (ベータ公開しないで実行すると、「指定したアイテムは購入できません」というエラーが出る) 6. AndroidStudioを開く。 ProjectStructureのDependenciesから、play-servicesを選択する。 以下、この記事を参考。 AndroidStudioでは、この記事も参考になった。 7. $ANDROID_SDK_ROOT/extras/google/play_billing/IInAppBillingService.aidl を自分のプロジェクトにコピーする。 AndroidStudioでは、以下の場所に変更になっている $PROJECT_DIR/app/src/main/aidl/com/android/vending/billing/IInAppBillingService.aidl 8. $ANDROID_SDK_ROOT/extras/google/play_billing/samples/ 以下にサンプルコードがあり、ほぼそのまま使える。 $ANDROID_SDK_ROOT/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/util/*.java を丸ごと自分のプロジェクトのsrc以下にコピー。package名だけ変える $ANDROID_SDK_ROOT/extras/google/play_billing/samples/TrivialDrive/src/com/example/android/trivialdrivesample/MainActivity.java を参考にしながら自分のプロジェクトのアクティビティクラスに書く。 サンプルには多くのファイルがあるが、直接使うのはIabHelper.javaだけ。 このファイルが IInAppBillingService への処理を肩代わりしている。 あとは簡単なデータ構造体として 全体的な情報(登録アイテム情報や購入済み=非消費型アイテム情報)を格納しているInventory.java, 1つの課金アイテム情報を格納しているSkuDetails.java, 1つの課金処理トランザクション情報を格納しているPurchase.javaなど。 9. ライセンスキーをコードに記述。 base64形式で google play developer consoleに書かれているので、コピーしてコード中に記述。 サンプルコードでは、IabHelperのインスタンシエート時に必要。 10. 先ほどgoogle play developer consoleで作成した課金アイテムのプロダクトIDを適宜コードに記載。 プロダクトIDはSKUとも呼ばれる。 SkuDetails.getSku()などで取得できる。 IabHelper.queryInventoryAsync()のmoreSkusなどもこれ。 11. 適宜IabHelperを改造する。 例えば、登録している課金アイテム情報を取得する方法が無いので、 Inventory.getAllSkus() を public にしたりとか。 以上で実装は完了。引き続き動作確認に入る 12. テストアカウントを作成。 google play developer consoleの設定→アカウント詳細に ライセンステスト という項目があり、そこにメールアドレス(google playアカウント)を記述する。これがテスト購入できるアカウントとなる。 なお、このconsole自体のgoogleアカウントはテストには使えないようになっている。デベロッパー自身が課金購入できないようになっているからだと思われる。 13. 実機端末で、先ほどのアカウントでgoogle playにログイン。 実機のgoogle playは複数アカウントでログインできるものもあるが、「その端末で最初にログインしたアカウント」でしかテスト実行ができないという記事もあった。 その場合、端末を初期化して再度テストアカウントでログインする、という大変なことになるとか。 で、ベータ公開設定画面の「オプトインURL」にアクセス。 すると、「テスターになる」ボタンがあるのでクリック。 これでテストユーザになれる。 これを忘れると、apkのベータ公開後でも「指定したアイテムは購入できません」と出てしまう。 14. 署名付きでapkを作成する 署名が無いと課金購入テストができない。 (署名無しのアプリでテストアカウントで課金購入すると、「このバージョンのアプリは、Google Playを通じたお支払いはご利用になれません。詳しくはヘルプセンターをご覧ください。」というエラーが出る。) (また、署名つまりkey_storeが異なっていても上記のエラーが出る。そもそも署名が変わるとandroid consoleに提出できなくなる。くれぐれもkey_storeのパスワードなど忘れないように) (また、課金テストしているバージョンと、ベータ公開しているバージョンが同一である必要がある。公開したら開発中のバージョンは上げたくなるものだが、そこはこらえて) eclipseでプロジェクトを右クリック→Android tools→Export Signed Android Packageをクリック なお、ここでLintまわりのエラーが起きることがある。 その場合の対処はこの記事などを参照。 「◯◯の文字列のベラルーシ語が無い」のようなローカライズ周りのエラーの場合、プロジェクト設定→Android Lint Preferences→Correctness:Messages:MissingTranslation をwarningに変更することになる。 15. 出力したapkにzipalign 16. $adb install コマンドで実機転送 17. 動作確認。 当たり前だがネットワークが繋がっていることを確認のこと。 購入するとき、「これはテスト用の注文です。課金は発生しません。」と表示されるので安心。 その他注意点。 onIabPurchaseFinished や onConsumeFinished コールバックの引数は、 結果を表す IabResult と、アイテム情報を渡す Purchase があるが IabResultが失敗の場合、Purchaseがnullになる。 参考 参考 参考 チェック項目一覧 参考URL https://groups.google.com/forum/#!topic/android-group-japan/hOFJKNFDCe8 --- AndroidManifestに必要な権限等を設定している。 APKには自分の証明書をセットしている(debug証明書ではない) デベロッパーコンソールにテストアカウントのメールアドレスを登録している。 確認に使用するAPKと同じVersionCodeのAPKをデベロッパーコンソールへアップロードしている。 テストアカウントはGoogleCheckoutの設定を正しくおこなっている。 テストアカウントがプライマリアカウントとして端末に設定して稼働させている。 GooglePlayアプリで使用許諾に同意している。 署名の確認をおこなうならばアプリの公開鍵は正しいものを使用している。 --- |
|
iOSと比べると、あまりシステム音というのはない。
参考 使える音は以下 DEFAULT_ALARM_ALERT_URI DEFAULT_NOTIFICATION_URI DEFAULT_RINGTONE_URI |
Androidで画像を切り取る方法。
参考 iOSと比べて面倒。 BitmapRegionDecoderというクラスを使う。 このクラスは、コンストラクタにFileインスタンスを渡して作成する。 decodeRegion()というメソッドにRectを渡すと、その範囲を切り取ったBitmapインスタンスを返す。
単にファイルからビットマップを作りたいときは
となる。 デコードに失敗するとnullが返ることになる。 ちなみに、アセット内の画像ファイルからビットマップを読み込む方法は
となる。 逆に、ビットマップをファイルに書き出すときは
とする。bitmapの中身がfileに書き出される。 |
ThreadPoolExecutorで実行時にハングアップしたとき
AsynkTask クラスのインスタンスのexecute()のところに不具合があった。
このverifierがnullだったのでエラーになった。 |
何かの処理中に出すようなUI。
iOSでいうとインジケータ。Windowsでいうと砂時計。 ProgressDialog を使う。簡単 表示するとき
消すとき
これだけ。 |
Eclipseは起動が遅い。
起動したときに必ずSDK Content Loaderが走り、それが100%になるまでビルドその他の処理は実行できない。 そしてこれが遅い。 ネットワークが遅いとさらに遅い。 ネットワークが繋がっていても、 SDK Content Loaderが0%のまままったく進まないときがある。 そのときは、以下を参考。 参考 要するに workspace/.metadata/.plugins/org.eclipse.core.resources/.projects をまるごと消してしまう。 乱暴だ…。 削除してからEclipseを起動すると、プロジェクトの中身がなくなっている。 (プロジェクト名だけ残して、中身のファイルはなくなる) Refreshコマンドを実行しても戻らない。 一度消して、再度プロジェクトの追加を行うことになる。 (File->New->Other->Android Project from Existing Code) ライブラリプロジェクトも漏れなく消えるので、追加してBuild Projectをお忘れなく。 workspaceディレクトリ以下にあるプロジェクトは自動で復活するらしい。 あとは、adbプロセスを削除するという手もあるようだ。 |