2012年6月24日日曜日

グーグルプレイのマーケティング

五日前グーグルプレイに登録したアプリの一つの有効ダウンロード数が100を超えました。
合計インストール数が172なので60パーセントの定着率です。
他のアプリもそこそこダウンロードされていますが定着率は50パーセント以下です。
独自性が有るアプリは定着率が高い傾向です。

ダウンロード数を伸ばすにはマーケットの検索上位に入る必要がありそうです。
そこでどうすれば上位に入るのか調べてみました。
1,インストール総数(削除されていない)
2,インストール回数(アップデート回数を含む)
3,コメント評価3以上をもらう
4,グーグルプレイに広告を載せる(有料)


ダウンロード数を伸ばすには検索上位に入らなければならない。
検索上位に入るにはダウンロード数を伸ばさなければならない。


つまり個人での新規参入は厳しい。。


企業ならお金で広告を載せてダウンロード数を稼げるが、個人では厳しいところです。
それとアプリを説明する英語力は高い方が良い。
そうでなければ日本国内に絞った方が良い。
機械では日本語を外国語にまともに翻訳できないです。

2012年6月22日金曜日

無料広告無しシリーズ

無料で広告無しANDOROIDアプリをリリースしました。

鏡 広告無し
フロントカメラを使用して鏡代わりにします。
縦横比率も制御されています。

・漫画ビューワ 広告無し
栞、ファイルの選択、拡大、表示位置の調整。
読みやすく使いやすい機能を備えてあります。


無音カメラ 広告無し
シャッター音を鳴らさないカメラです。
拡大、オートフォーカス、縦横撮影、保存先の選択、ギャラリー。
無音カメラの中では最高の解像度です。





全てインターネットアクセスを行わない安全なアプリケーションです。
シンプルかつ高性能な構造になっています。

2012年6月18日月曜日

音声リモコンカメラ~Voice Remote control Camera

音声リモコンカメラ
無料アプリ(音声リモコンカメラ)を公開ました。
音声でカメラのシャッターを切ることができるアプリです。
撮影時に登録した音声をマイクで拾うとシャッターを切ります。
無音撮影(サイレントシャッター)もすることができます。(撮影解像度は端末の画面解像度)
オートフォーカスやフラッシュにも対応。(端末がサポートしていない場合は無効)
音声撮影時はスリープ機能無効。
撮影した画像の一覧表示と削除、フルスクリーン表示。


2012年6月14日木曜日

グーグルプレイ登録 Google Play への登録はまだ処理中です

1980円ほどデビットカードで支払い、デベロッパー登録をしました。
アプリの登録をしようとデベロッパーコンソールを開いてみると
Google Play への登録はまだ処理中です。
……↓
約三時間
Google Play への登録が承認されました。』
三時間ほどかかりましたが無事に登録されました。
人によっては一週間くらい処理中のままで、そのうえ認証失敗するらしい。
何の処理をしているやら怪しいですね。

アプリを登録してマーケットに表示されるようになるにも三時間ほどかかります。
初回アプリの登録に計六時間

円高ですし、早めに登録しておいてもいいかもしれません。

2012年6月10日日曜日

メモリリーク対策

java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
メモリリークエラーは端末に設定されているヒープ領域によって発生頻度が違います。
大まかな目安として解像度で判断する方法があります。



   WindowManager wm = getWindowManager();


           Display d = wm.getDefaultDisplay(); 


if(d.getWidth()<=900 || aheigth = d.getHeight()<-900){//解像度が900以下なら
              //ビットマップの解像度を900*2以下にする処理
}


他にも、ローカルに補助記憶にデータを退避させるクラスや、ガーべジコレクションを強制的に行うクラスでビットマップをラッピングする方法があります。

開発メモ10~アプリの名前変更

アプリの名前を変更するには幾つか方法があります。
しかし、どの方法も面倒です。
名前変更くらいパラメーターを一つ変更すれば良さそうな物ですが、
表示される名前と内部のファイル名が関連しているため手順を間違えると気付けないところに不具合が出たりします。

確実な方法としてプロジェクトを作りなおしてファイルをコピーするのがベストかもしれません。
その際の注意事項としては

・古いプロジェクトが自動的にインポートされてしまう
JAVAファイル

・古いプロジェクトのパスが自動的に補完される
XMLファイル

R.java関連のエラーがある場合は
import android.Rが補完されているの原因かもしれません。

2012年6月9日土曜日

コンテンツレート マーケットでの配布の注意事項

グーグルプレイで配布されているアプリにはコンテンツレートがあります。
アプリのダウンロード画面にある「ユーザー成熟度」ってなんだろうと思う方も居るかもしれません。
グーグルプレイのヘルプ

アプリで以下の表現がある場合は注意してください

アルコール、タバコ、薬物
ギャンブル
差別
現在地情報の取得
冒とく的な表現、下品なユーモア
性的なコンテンツ、性的なものを暗示するコンテンツ
ユーザー作成コンテンツとユーザー間通信
暴力
レーティングが不適切なアプリケーション
以下引用
>ユーザーは、アプリケーションのレーティングが不適切であると判断した場合、それを Google に報告できます。
>Google でも不適切だと判断した場合は、Google のガイドラインに従い、レーティングを変更させていただきます。
>違反が繰り返される場合は、アカウントの停止を含む措置をとらせていただくことがあります。

それと、基本的な事ですが著作権など、一般的なコンプライアンスも必要です。

アカウント停止を受けるとデベロッパーアカウント以外のGoogle系のアカウントも使えなくなります。

程度にもよりますが具体的には5回警告を食らったらアウトのようです。
二度とアカウントが復旧されることはありません。


2012年6月8日金曜日

開発メモ8~APIレベル(バージョン)毎の違い1

ANDOROIDOはバージョン毎にコードが異なることがあります。

画面レイアウト指定の違い
1.5以前 フルスクリーンできない
1.6~2.1 フルスクリーン可能

    android:layout_width="match_parent"
    android:layout_height="match_parent"
2.2以降
   android:layout_width="fill_parent"
    android:layout_height="fill_parent"

タッチイベントの違い
2.0以前 マルチタッチできない
2.1以降
 event.getPointerCount() //何点たっちされているか
 float x = event.getX(0) - event.getX(1);//引数で一点目と二点目を区別

APKをインストールするばしょの指定
2.1以前自動的に本体にインストール
2.2以降
<manifest直下
 android:installLocation="auto">
android:installLocationには3つの値が設定できる。
internalOnly: Android内蔵メモリへのインストールのみ許可。
auto: Android内蔵メモリ優先で、SDカードに移動可能。
preferExternal: SDカードを優先で、Android内蔵メモリ移動可能。

2012年6月7日木曜日

開発メモ7セキュリティ~パッケージ内のファイルをバイト配列にする


内部リソースを外部に見せないためには、
予め暗号化したファイルを端末内部で復号して使用する

//パッケージ内のファイル→バイトデータ
    public  byte[] fileToByte(String fileName) //クラスと同じパッケージならファイル名のみで可
        throws Exception {
        int size;
        byte[] byteAry=new byte[1024];
        InputStream fin=null;
        ByteArrayOutputStream out=null;
        try {
            fin= getClass().getResourceAsStream(fileName);//内部リソースを取得
            out=new ByteArrayOutputStream();
            while (true) {
                size=fin.read(byteAry);
                if (size<=0) break;
                out.write(byteAry,0,size);
            }
            fin.close();
            out.close();
            return out.toByteArray();
        } catch (Exception e) {
            try {
                if (fin!=null) fin.close();
                if (out!=null) out.close();
            } catch (Exception ee) {
            }
            throw e;
        }
    }