2013年4月30日火曜日

アプリのプロモーション動画の効果

アプリのプロモーションの一つとしてYoutubeでの動画の公開があります。
 
デベロッパーコンソールでもこのように
 
アプリのページに動画を設定する場所が用意されていてGoogle Playでも表示されるので、アプリを入れようとする人は見ることが多いと思われます。
動画のプロモーション効果として説明とスクリーンショットでは伝えきれないアプリの魅力を伝えることが出来ることと、アプリの操作方法をとてもわかりやすく伝えられることがあります。
アプリの魅力が伝わることはアプリのインストール数増加が見込まれるし、アプリの操作が理解されやすいことでアンインストール数を抑える効果があります。
実際拙作のEasyBowlingで公開当初アンインストール率が高く、動画を作って公開したところ

 アンインストール数総インストール数アンインストール率
動画公開前(3ヶ月)3841586765%
動画公開後(3ヶ月)78941654148%

動画公開後アンインストール率が目に見えて減りました。
このゲームが特に操作方法がわかりにくいというところもあると思いますが、それなりに効果があると思われます。

2013年4月29日月曜日

PhotoRouletteがミートロイドでレビューされましたー

PhotoRouletteミートロイドでレビューしていただきましたー。



Androidアプリのレビューサイトの依頼の成果がやっとでた感じです。
おそらく1件目のレビューとなります!ありがたいことです。

2013年4月25日木曜日

PopupMenuの内容を動的に設定

結局使わなかったがAPI level 11(HONEYCOMB)から利用可能になったPopupMenuの内容を動的に変えようと思ったらあまり情報がなかったので書いておきます。

表示はこんな感じ

ソースはこんな感じ

PopupMenu popup =new PopupMenu(MainActivity.this, findViewById(R.id.button1));
popup.getMenu().add(1, 1, 1, "TEST1");
popup.getMenu().add(1, 2, 2, "TEST2");
popup.getMenu().add(1, 2, 3, "TEST3");
popup.show();
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
  @Override public boolean onMenuItemClick(MenuItem item) {
    Log.v("LOG", "Menu:" + item.getGroupId() + "," + item.getItemId());
    return false;
  }
});

なぜ使わなかったのかというと表示位置がviewのアンカーでの指定しか出来ず、任意の位置に出せなかったから。
任意の位置に出せる方法を知ってる人がいたら教えてくださーい

2013年4月24日水曜日

Androider+6月号に"間取りー図"が掲載されたー

アンドロイダー+(プラス)6月号(4月19日発売)に間取りー図が掲載されましたー



自分の作ったアプリが本に載るっていうのは一つの目標でしたので、すごくうれしいですね

2013年4月23日火曜日

ダイアログのボタンなどに表示する文字列

アプリではよくダイアログを表示して○○でよろしいですか?"OK" or "Cancel"とかよく表示することがあると思います。



ここで表示する"OK"等の文字列はリソースで用意したR.string.*とか、直接コードに書いている方もいるでしょう。
しかし、OKやCancelなどの一般的な文言はAndroid本体のリソースであるandroid.R.stringを使うべきかと思います。
なぜかというとandroid.R.stringはAndroidが対応する全ての言語に対応しているからです。SDKにあるリソースのフォルダを見てみるとこんな感じ。



全ての言語に対応したフォルダがあります。
これらはOS標準のアプリや設定で使用されますので、それらとの統一を図る意味でもこちらを使用したほうがいいと思います。

2013年4月22日月曜日

画像の回転ロジック

PhotoRouletteでは12個の画像を回転させていますが、ルーレットに使う画像がたとえ1個でも100個でも大丈夫なように作っています。
実際には画像をArrayList<Bitmap>にすべて入れて下から順番に左回りに回転させながら描画しています。
 このとき回転角が360/12を超えたときリストから描画するindexに+1して12枚に足りなければ0から繰り返し12枚より多ければ2~13を表示というようにしていきます。
ソースは以下のような感じ。

//回転角+1
angle += 1f;
//回転角が360/12を超えたら描画開始indexを1つ増やす
if (angle >= (360f / 12f)) {
    angle = angle - (360f / 12f);
    start++;
    //ルーレットの画像数を超えたら0に戻す
    if (start > roulette.images.size()) { start = 0;}
}
Matrix mat = new Matrix();
//描画開始indexをセット
int index = start;
for (int i = 0; i < 12; i++) {
    mat = new Matrix();
    //画像中心を中心点にして回転
    mat.postRotate(((360f / 12f) * i) - 180f + angle, width / 2f, height / 2f);
    canvas.drawBitmap(roulette.images.get(index), mat, paint);
    index++;
    //ルーレットの画像数を超えたら0に戻す
    if (index >= roulette.images.size()) { index = 0;}
}

このルーレットを回すロジックはいろんなやり方で実装できると思いますが、結果が同じであればどんなやり方でもいいと思います。
こんなこというと怒られますが、今時多少効率の悪い書き方をしても影響が出る場面は少ないですし、よく後から見て直しやすく再利用しやすいようにとか言いますが、こういう汎用的ではない処理は実際のとこ見ることも再利用することも極々稀で多くの場合は1から作った方が古いのよりいい物が出来ます。

2013年4月19日金曜日

カメラ画像からの透過画像作成

今回のアプリPhotoRouletteでちょっと手こずった透過画像の作成です。






このようなカメラから取得した画像(実際はもっと大きいです)を





ルーレットで使用するためこのように台形状に切り出して透過画像を作成したい


今回とった手法は以下のような感じ
  1. Bitmap.createBitmapでカメラ画像から必要な大きさ分を切り出して作成
  2. もう一回Bitmap.createBitmapで切り出した画像から編集用Bitmapを作成。
    この時注意することとして、createBitmapのconfig指定をBitmap.Config.ARGB_4444かARGB_8888RGにする。RGB_565にしてしまうと透過しない。
  3. paint.setColor(Color.TRANSPARENT)を指定
  4. paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.CLEAR))を指定
  5. drawPathで画像の左右の透過したい三角の部分を塗りつぶします。
ソースとしては以下

 //切り出し画像作成
 Bitmap clip = Bitmap.createBitmap(image, (int)(image.getWidth() * 0.2), (int)((image.getHeight() - (image.getWidth() * 0.5)) / 2), (int)(image.getWidth() * 0.6), (int)(image.getWidth() * 0.5));
 //透過編集用画像作成 
 Bitmap edit = Bitmap.createBitmap(clip.getWidth(), clip.getHeight(), Bitmap.Config.ARGB_8888);
 Canvas canvas = new Canvas(edit);
 canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
 canvas.drawBitmap(clip, 0, 0, paint);
 //透過用Paint作成
 Paint paint = new Paint();
 paint.setColor(Color.TRANSPARENT);
 paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.CLEAR));
 paint.setStyle(Style.FILL);
 //左下透過部分
 Path path = new Path();
 path.moveTo(0, 0);
 path.lineTo(0, edit.getHeight());
 path.lineTo(edit.getHeight() * 0.265f, edit.getHeight());
 path.lineTo(0, 0);
 canvas.drawPath(path, paint);
 //右下透過部分
 path = new Path();
 path.moveTo(edit.getWidth(), 0);
 path.lineTo(edit.getWidth(), edit.getHeight());
 path.lineTo(edit.getWidth() - (edit.getHeight() * 0.265f), edit.getHeight());
 path.lineTo(edit.getWidth(), 0);
 canvas.drawPath(path, paint);

2013年4月18日木曜日

Androidアプリの設計

さて、作りたいアプリが決まったら設計に入ります。
これは人によって違うでしょうが、私の場合アプリに必要な画面を紙に全部書いていきます。
規模によっても違いますが、いままで作ってきたのではこれがそのまま設計書になります。
今回のPhotoRouletteの場合下のような感じ、大変汚い殴り書きで恥ずかしい…
画面を書いたらその中で必要な機能を書いておきます。
そのあとはこの中で必要になりそうなクラスで主要なデータになるやつと複雑なやつは
大雑把にクラス設計をしておきます。
今回の場合はルーレットのデータになるクラスを作りました。

public class Roulette {
 String name = "";
 Date date = null;
 int count = 0;
 Bitmap image = null;
 ArrayList<Bitmap> images;
}

それほど複雑なアプリでなければこれで私の場合これで設計完了です。

2013年4月17日水曜日

Androidアプリの効果音

今回のPhotoRouletteで使っている効果音は二つ、ルーレット開始と決定時だけですが、こちらの効果音を利用させてもらってます。

ザ・マッチメイカァズ2nd
現在更新は止まっているようですが、約1600種類もの効果音があります。
ここにあるファイルはwavファイルなのでoggに変換してres\raw\フォルダの中に入れてSoundPoolを利用して使っています。
効果音なんかの場合レスポンスがいいSoundPoolを使ったほうがいいと思います。

その他フリーの効果音・BGMはこちらがとても参考になります。
効果音・BGMのフリー音素材リンク集 - NAVER まとめ

2013年4月16日火曜日

Androidアプリの企画

アプリを作る際にはいろいろと企画を練って検討しますが、
PhotoRouletteを作るときは企画のベースとして
・カメラを使ったアプリ
・レビューされそうなアプリ
という前提で考えていきました。

自分の場合、企画は脳内企画→市場調査→脳内設計→企画判定
という流れを決定になるまで繰り返します。
今回の例では以下のような感じでした。

[脳内企画]カメラで顔写真をとってタップすると殴ってる感じになってストレス解消するアプリ
[市場調査]既に出来のいい奴がある
[脳内設計]画像の変形処理が課題
[企画判定]既に同種があるのでボツ

[脳内企画]カメラで顔写真をとって強さを表示するアプリ(○カウターのパクリ)
[市場調査]既にある
[脳内設計]画像から強さを導き出す処理が課題
[企画判定]既に同種があるのでボツ

GooglePlayでは2012年9月現在67万5000本のアプリがあるわけで
普通に考えつくようなものはたいてい既にある。
別に同種のアプリがあるからといって止めなくてもいいわけですが、 
それを超えるものかコンセプトが違うものでなければやる意味がないですね。

つづき

[脳内企画]カメラで写真をとって人を認識して肩にキャラクターとかのせるアプリ
[市場調査]顔認識してどうこうとかいうのはよくある
[脳内設計]
人を背景から分離するにはステレオ撮影と認識処理が必要
付加する魅力的なネタ、キャラクター等を考案・作成しなければならない
[企画判定]技術的、素材的面からみてハードルが高いのでボツ

[脳内企画]カメラで写真をとってルーレットを作成する
[市場調査]Androidではなさそう
[脳内設計]画像の加工が課題
[企画判定]ネタとして受けそうだし、実現性も高そうなのでこれに決定

本当はもっといろいろくだらないのもあるんですが、いろいろ考えてると
すぐなんかの2番煎じになってしまうのがはまりどころですね
まあ個人開発なので作りたいかどうか!ってのが一番の決定要素です。

2013年4月15日月曜日

Android機種依存(カメラ編) 鬼門その4

鬼門その4
その他いろいろ

 2つ以上のカメラを持つ場合、Camera.open(int cameraId)で使うカメラを指定して取得することが出来ますが、フロントカメラを指定した場合初回のみ上下が反転してしまう機種がありました。
 これの対応は初回はバックカメラ指定にするか、指定せずにCamera.open()で端末に任せる(未検証)のがいいのかなと思います。

 カメラの向きについて、画面の向きによって設定を変えないと
プレビューや取得画像の向きが合わなくなります
 こちらのサイトが大変参考になりました。Androidのカメラの向きに関する覚え書き

 あと機種依存の話ではないですが、カメラを使う場合パーミッションの設定を特に何も考えずこんな風にしてました。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.flash" />
しかしこれだと、オートフォーカスとフラッシュを搭載してない端末は対応外となるため 
対応端末が大幅に減ります
私の記憶だとこの設定だと1400端末ほどで、下の記述だと2714端末(2013/4/13現在)になります
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
オートフォーカスやフラッシュがどうしても必要な場合でなければ、android:required="false" を明記しておくほうがいいかと思います。

もうひとつ参考になったサイト Androidのデバイス依存メモ[カメラ周り] あとで読む

その4まで来ましたが、これでもまだカメラの機種依存は書ききれません…
直接PictureCallBackで画像を取る場合や暗黙的Intentで取る場合など、まだまだ鬼門が出てきます。

2013年4月12日金曜日

Android機種依存(カメラ編) 鬼門その3

鬼門その3
プレビュー用SurfaceView関連

 SurfaceViewを利用してプレビューを表示する場合、表示しているSurfaceViewには手を出せないんで、Viewを重ねて処理している方が多いかと思います。
この場合Resume時やレイアウトの変更時に上に重ねたViewが下に行っちゃったりします。
 対処としては、Resume時、レイアウト変更時に上に重ねたViewにbringToFront()をかけてやる。
これで今のところうまくいってます。

 あと、setPreviewSizeでプレビューのサイズを指定しても実際に表示されるプレビューはSurfaceViewのサイズになります。
 なので比率がおかしくなったりしないようにカメラのPreviewSizeに合わせてSurfaceView側の大きさを変えましょう。

 それとsurfaceDestroyedイベントできちんとカメラを開放しましょう。でないと他のアプリでカメラが使えなくなったりします。解放はこんな感じで↓

public void surfaceDestroyed(SurfaceHolder holder) {
    if(camera != null){
        camera.setPreviewCallback(null);
        camera.stopPreview();
        camera.release();
    }
    camera = null;
}

2013年4月11日木曜日

Android機種依存(カメラ編) 鬼門その2

鬼門その2
TakePictureCallback関連の機種依存

 TakePictureCallbackまわりにも機種依存が多いですね。

 例えばtakePictureを呼ぶと通常はシャッター音が鳴りますが、ICS以降(恐らく)機種によっては鳴りません
単純に鳴らしたい場合は、空のShutterCallbackを入れてやれば鳴るようです。

 あとtakePictureを投げるとプレビューは止まるというのが通常ですが、機種によっては止まりません
ここでプレビューを止めたいからといってTakePictureする前にstopPreviewしてしまうと、コールバックがされなかったり、takePictureで強制終了したりします。

 それとTakePictureCallbackに限った問題ではありませんが、画像を取得する際にOutOfMemoryが発生する危険がありますんで気を付けましょう。

2013年4月10日水曜日

Android機種依存(カメラ編) 鬼門その1

Android開発の鬼門と呼ばれているカメラアプリですが、もうたくさんの先人たちがつくってるしまあ大丈夫だろうと軽い気持ちでやったらはまりました…
強制終了の嵐です。

鬼門その1
setPictureSizeにはgetSupportedPictureSizesで得られるセット以外は入れない

持ってる実機で通ったからといって安心してはいけません。
適当なサイズを入れるとコロッと落ちます
あとgetSupportedPictureSizes()で得られるリストの1個目を使うサンプルがよくありますが、このリストは大きい順に並んでいる保証はないようです。
いずれにしろ画像取得する時の処理も考えると、大きさの制限を入れて値を見ながら取得するほうがいいでしょう 。
今回実装したのは以下のような感じです。

public void setPictureSize(Camera cam, int maxWidth) {
    //端末がサポートするサイズ一覧取得
    Camera.Parameters params = cam.getParameters();
    List<Size> sizes = params.getSupportedPictureSizes();
    if ( sizes != null && sizes.size() > 0) {
        //撮影サイズを設定する
        Size setSize = sizes.get(0);
        for(Size size : sizes){
            if(Math.min(size.width, size.height) <= maxWidth) {
                setSize = size;
                break;
            }
        }
        params.setPictureSize(setSize.width, setSize.height);
        cam.setParameters(params);
    }
}

2013年4月9日火曜日

PhotoRouletteのスクリーンショット

今回PhotoRouletteのスクリーンショットを取るにあたり
モデルピースさんの素材を使わせていただきました。
http://www.modelpiece.com/
日本人がモデルの写真で無料なのはあまりない気がします。

カメラ系のアプリを作るときには重宝しますね。

2013年4月8日月曜日

Androidアプリのレビューサイトの依頼先(国内) まとめ

アプリの公開するとまあ少なからず使ってくださる方がいますが、個人開発で作りたいものを作ってるだけとはいえせっかく作ったんだから多くの人に使ってもらいたいし、ちょっとは対価もほしいですよね…

アプリのプロモーションとしてまず最初にやるべきはやはり、レビューサイトへのレビュー掲載の依頼でしょう。
基本的に無料ですし、大手のレビューサイトに乗るようなことがあればかなりのプロモーション効果が期待できます。
今回拙作PhotoRouletteについて以下のレビューサイトへ掲載の申し込みをしました。

たくさん掲載されるといいのですが…

サイト名依頼方法備考
APPREVIEWフォーム
OCTOBAフォーム
andronaviフォーム
meetroidメールテンプレ有
ドロイドバンクフォーム有料掲載有
オールアプリフォーム
gooスマホ部メール
アンドロックメール
アプリオメール
AppVipフォーム画像アップロード有
AppLabフォーム
アプリゲットフォーム画像アップロード有
アプリスタメール
Favroidフォーム有料掲載有
アプリソムリエフォーム画像アップロード有
AppWomanフォーム女子向け
アンドロJapanメール
TABROIDメール
萌えドロイドメール萌え系
App DIMEメール
ファミ通Appメールゲーム
MobileASCIIメール
スマプリフォーム女性向け
Ketchapp!メールテンプレ有、有料有
アンドロイド・ゲームズメールゲーム

2013/11/14 こちらに更新版作成しました
http://anadreline.blogspot.com/2013/11/android.html