2013Anadreline主にAndroidアプリ開発関連の雑記2013年4月30日火曜日アプリのプロモーション動画の効果アプリのプロモーションの一つとしてYoutubeでの動画の公開があります。Playでも表示されるので、アプリを入れようとする人は見ることが多いと思われます。動画のプロモーション効果として説明とスクリーンショットでは伝えきれないアプリの魅力を伝えることが出来ることと、アプリの操作方法をとてもわかりやすく伝えられることがあります。アプリの魅力が伝わることはアプリのインストール数増加が見込まれるし、アプリの操作が理解されやすいことでアンインストール数を抑える効果があります。48%動画公開後アンインストール率が目に見えて減りました。このゲームが特に操作方法がわかりにくいというところもあると思いますが、それなりに効果があると思われます。プロモーション2013年4月29日月曜日PhotoRouletteがミートロイドでレビューされましたーPhotoRouletteをミートロイドでレビューしていただきましたー。Androidアプリのレビューサイトの依頼の成果がやっとでた感じです。1件目のレビューとなります!ありがたいことです。11(HONEYCOMB)から利用可能になったPopupMenuの内容を動的に変えようと思ったらあまり情報がなかったので書いておきます。}});なぜ使わなかったのかというと表示位置がviewのアンカーでの指定しか出来ず、任意の位置に出せなかったから。任意の位置に出せる方法を知ってる人がいたら教えてくださーい。"Cancel"とかよく表示することがあると思います。ここで表示する"OK"等の文字列はリソースで用意したR.string.*とか、直接コードに書いている方もいるでしょう。OKやCancelなどの一般的な文言はAndroid本体のリソースであるandroid.R.stringを使うべきかと思います。いうとandroid.R.stringはAndroidが対応する全ての言語に対応しているからです。SDKにあるリソースのフォルダを見てみるとこんな感じ。全ての言語に対応したフォルダがあります。これらはOS標準のアプリや設定で使用されますので、それらとの統一を図る意味でもこちらを使用したほうがいいと思います。画像の回転ロジックPhotoRouletteでは12個の画像を回転させていますが、ルーレットに使う画像がたとえ1個でも100個でも大丈夫なように作っています。実際には画像をArrayList<Bitmap>にすべて入れて下から順番に左回りに回転させながら描画しています。このとき回転角が360/12を超えたときリストから描画するindexに+1して12枚に足りなければ0から繰り返し12枚より多ければ2~13を表示というようにしていきます。ソースは以下のような感じ。0;}}このルーレットを回すロジックはいろんなやり方で実装できると思いますが、結果が同じであればどんなやり方でもいいと思います。こんなこというと怒られますが、今時多少効率の悪い書き方をしても影響が出る場面は少ないですし、よく後から見て直しやすく再利用しやすいようにとか言いますが、こういう汎用的ではない処理は実際のとこ見ることも再利用することも極々稀で多くの場合は1から作った方が古いのよりいい物が出来ます。今回のアプリPhotoRouletteでちょっと手こずった透過画像の作成です。このようなカメラから取得した画像(実際はもっと大きいです)をルーレットで使用するためこのように台形状に切り出して透過画像を作成したい今回とった手法は以下のような感じBitmap.createBitmapでカメラ画像から必要な大きさ分を切り出して作成もう一回Bitmap.createBitmapで切り出した画像から編集用Bitmapを作成。この時注意することとして、createBitmapのconfig指定をBitmap.Config.ARGB_4444かARGB_8888RGにする。RGB_565にしてしまうと透過しない。PorterDuffXfermode(android.graphics.PorterDuff.Mode.CLEAR))を指定drawPathで画像の左右の透過したい三角の部分を塗りつぶします。開発2013年4月18日木曜日Androidアプリの設計さて、作りたいアプリが決まったら設計に入ります。これは人によって違うでしょうが、私の場合アプリに必要な画面を紙に全部書いていきます。規模によっても違いますが、いままで作ってきたのではこれがそのまま設計書になります。今回のPhotoRouletteの場合下のような感じ、大変汚い殴り書きで恥ずかしい...画面を書いたらその中で必要な機能を書いておきます。そのあとはこの中で必要になりそうなクラスで主要なデータになるやつと複雑なやつは大雑把にクラス設計をしておきます。今回の場合はルーレットのデータになるクラスを作りました。images;}それほど複雑なアプリでなければこれで私の場合これで設計完了です。今回のPhotoRouletteで使っている効果音は二つ、ルーレット開始と決定時だけですが、こちらの効果音を利用させてもらってます。ザ・マッチメイカァズ2nd現在更新は止まっているようですが、約1600種類もの効果音があります。ここにあるファイルはwavファイルなのでoggに変換してres\raw\フォルダの中に入れてSoundPoolを利用して使っています。効果音なんかの場合レスポンスがいいSoundPoolを使ったほうがいいと思います。その他フリーの効果音・BGMはこちらがとても参考になります。無料素材2013年4月16日火曜日Androidアプリの企画アプリを作る際にはいろいろと企画を練って検討しますが、PhotoRouletteを作るときは企画のベースとして・カメラを使ったアプリ・レビューされそうなアプリという前提で考えていきました。いう流れを決定になるまで繰り返します。今回の例では以下のような感じでした。[脳内企画]カメラで顔写真をとってタップすると殴ってる感じになってストレス解消するアプリ[市場調査]既に出来のいい奴がある[脳内設計]画像の変形処理が課題[企画判定]既に同種があるのでボツ[脳内企画]カメラで顔写真をとって強さを表示するアプリ(○カウターのパクリ)[市場調査]既にある[脳内設計]画像から強さを導き出す処理が課題[企画判定]既に同種があるのでボツGooglePlayでは2012年9月現在67万5000本のアプリがあるわけで普通に考えつくようなものはたいてい既にある。それを超えるものかコンセプトが違うものでなければやる意味がないですね。本当はもっといろいろくだらないのもあるんですが、いろいろ考えてるとすぐなんかの2番煎じになってしまうのがはまりどころですねまあ個人開発なので作りたいかどうか!ってのが一番の決定要素です。cameraId)で使うカメラを指定して取得することが出来ますが、フロントカメラを指定した場合初回のみ上下が反転してしまう機種がありました。これの対応は初回はバックカメラ指定にするか、指定せずにCamera.open()で端末に任せる(未検証)のがいいのかなと思います。カメラの向きについて、画面の向きによって設定を変えないとプレビューや取得画像の向きが合わなくなります。こちらのサイトが大変参考になりました。Androidのカメラの向きに関する覚え書きあと機種依存の話ではないですが、カメラを使う場合パーミッションの設定を特に何も考えずこんな風にしてました。/>しかしこれだと、オートフォーカスとフラッシュを搭載してない端末は対応外となるため対応端末が大幅に減ります。明記しておくほうがいいかと思います。あとで読むその4まで来ましたが、これでもまだカメラの機種依存は書ききれません...直接PictureCallBackで画像を取る場合や暗黙的Intentで取る場合など、まだまだ鬼門が出てきます。鬼門その3鬼門その3プレビュー用SurfaceView関連SurfaceViewを利用してプレビューを表示する場合、表示しているSurfaceViewには手を出せないんで、Viewを重ねて処理している方が多いかと思います。この場合Resume時やレイアウトの変更時に上に重ねたViewが下に行っちゃったりします。対処としては、Resume時、レイアウト変更時に上に重ねたViewにbringToFront()をかけてやる。これで今のところうまくいってます。あと、setPreviewSizeでプレビューのサイズを指定しても実際に表示されるプレビューはSurfaceViewのサイズになります。比率がおかしくなったりしないようにカメラのPreviewSizeに合わせてSurfaceView側の大きさを変えましょう。それとsurfaceDestroyedイベントできちんとカメラを開放しましょう。ないと他のアプリでカメラが使えなくなったりします。鬼門その2鬼門その2TakePictureCallback関連の機種依存TakePictureCallbackまわりにも機種依存が多いですね。takePictureを呼ぶと通常はシャッター音が鳴りますが、ICS以降(恐らく)機種によっては鳴りません。単純に鳴らしたい場合は、空のShutterCallbackを入れてやれば鳴るようです。あとtakePictureを投げるとプレビューは止まるというのが通常ですが、機種によっては止まりません。ここでプレビューを止めたいからといってTakePictureする前にstopPreviewしてしまうと、コールバックがされなかったり、takePictureで強制終了したりします。それとTakePictureCallbackに限った問題ではありませんが、画像を取得する際にOutOfMemoryが発生する危険がありますんで気を付けましょう。鬼門その1Android開発の鬼門と呼ばれているカメラアプリですが、もうたくさんの先人たちがつくってるしまあ大丈夫だろうと軽い気持ちでやったらはまりました...強制終了の嵐です。鬼門その1setPictureSizeにはgetSupportedPictureSizesで得られるセット以外は入れない持ってる実機で通ったからといって安心してはいけません。適当なサイズを入れるとコロッと落ちます。あとgetSupportedPictureSizes()で得られるリストの1個目を使うサンプルがよくありますが、このリストは大きい順に並んでいる保証はないようです。いずれにしろ画像取得する時の処理も考えると、大きさの制限を入れて値を見ながら取得するほうがいいでしょう。今回実装したのは以下のような感じです。機種依存2013年4月9日火曜日PhotoRouletteのスクリーンショット今回PhotoRouletteのスクリーンショットを取るにあたりモデルピースさんの素材を使わせていただきました。http://www.modelpiece.com/日本人がモデルの写真で無料なのはあまりない気がします。カメラ系のアプリを作るときには重宝しますね。まとめアプリの公開するとまあ少なからず使ってくださる方がいますが、個人開発で作りたいものを作ってるだけとはいえせっかく作ったんだから多くの人に使ってもらいたいし、ちょっとは対価もほしいですよね...アプリのプロモーションとしてまず最初にやるべきはやはり、レビューサイトへのレビュー掲載の依頼でしょう。基本的に無料ですし、大手のレビューサイトに乗るようなことがあればかなりのプロモーション効果が期待できます。PhotoRouletteについて以下のレビューサイトへ掲載の申し込みをしました。PostsAndroidのcanvasに描画したイメージを画像ファイルで保存するアプリの中でcanvasに描画したイメージを画像として保存するという機能を付けたくなることがありますが、こんな感じで簡単に出力できます。まとめAndroidアプリの作成では様々な端末への対応を考慮しなければなりません。現在どのような端末が出てるのか、調査に便利なサイトをまとめてみました。かなりの数の端末が登録されていて国や...同じ構成のレイアウトを別ファイルにしてincludeで使うたまにリストにするような不定数ではないけど、同じようなView構成が続く画面レイアウトがあります。こんなときはまず繰り返す部分のみのxmlファイルを作ります。en...setColorとsetAlphaで半透過描画した時の落とし穴こんなのにはまるのは自分だけかもしれませんが、半透過の描画をしようとしてはまってしまったので書いておきます。組み合わせに注意しなければなりません。position)となっていて文字列では選択できません。これの対応は初回はバックカメラ指定...AndroidでSerializableなクラスを継承したクラスの落とし穴なんかよくわからんタイトルになってしまいましたが、Serializableなクラスを継承したクラスはSerializableをimplementsしなくてもSerializeすることができます。不具合は、リソースのdimen.xmlでdip単位で書いてある値をSurfaceViewのボタンの大きさ指定に使っているのですが、ここで間違った計算をしているのが原因でした。内容を動的に変えようと思ったらあまり情報がなかったので書いておきます。