素人のアンドロイドアプリ開発日記

アプリ制作のコンテンツ

out of memoryが起きる機種、起きない機種

2012.06.21

前にout of memoryについて学びましたが結局のところ、検証はどうすればいいの?って話をします。

 

androidの3から、メモリのブースとするみたいな機能があるので、それを使うとして、とりあえず大丈夫です。(使いすぎればもちろん落ちますが。)

android2でアプリを出すときに関係があります。

 

そもそもメモリサイズが512MBとかあるくせにバグで落ちるとかはギャグに近いような気がするのですが、実はアプリはひとつひとつ最大のメモリの使用量みたいのがあります。

Androidメモこのサイトによくまとまっているのですが、「アプリケーションヒープ」ってやつです。

多分galaxy sは32MBくらいある(??)のですが、検証をはじめると、機種によってはバカスカ落ちたのですが、この値がgalaxy sは一定のサイズを確保している為、一般にくらべ落ちにくい端末ではあります。

楓 software:: Androidに記載がある端末を見てみると、やはり落ちたものはヒープサイズが小さいものでした。

一説によると初期の日本で発売されたhtcは16MBとか言います。

 

ですが、時代もandroid4になっていくこともあり、out of memory で落ちない為に自分で買うべき端末を探した結果

nexus one

が一番的確かと思います。

ネックとし日本で出回った端末ではないので、海外で買うか、日本の輸入業者から購入する必要があるのですが、

理由としては、

アプリケーションヒープサイズが小さい→24MBらしい。ので、基本的にこの端末で落ちなければout of memoryで落ちない可能性が高い

また、androidのバージョンの2.3まで対応をしている。

という点で他のアプリケーションヒープサイズが小さいアプリだとアンドロイド2.2までなのが多いので、ここで一歩秀でています。

 

また、海外だとユーザー数が割りといたりするので、落ちない事を前提でつくる必要もあったりします。

 

以上を踏まえてnexus oneがout of memoryの問題を解決したい時に最も適した端末といえるかもしれません。

値段も現状だと1万~2万円程度で購入できるようです。

 

 

上記の内容は個人的な見解なので、購入などは自己責任で行なってください。

 

以上です。

カテゴリー:アプリ制作

Androidアプリのデザインをする上で注意したい点

2012.06.05

今回はAndroidのアプリデザインについて、稚拙ながら多少の発見をした為に提案も含めて、まとめたいと思います。

1、デザインのサイズ

960*640または、800*600のサイズで自分が所有している端末と違う解像度での作成をオススメします。※アイフォンのサイズだったりします。

この解像度はアンドロイドの中では、高い解像度であり、縦横比も横に長い方です。galaxyなどと解像度が違うのですが解像度が違う事が一番の利点となります。

androidは縦横比がさまざまな端末で利用される為、解像度の違いをどのようにこなして行くか?がひとつの課題となります。制作をすすめていくと、隙間が出たり、はみ出たりします。

デザインと端末の解像度が同じであると、その分解像度への意識が削がれてしまい、結果としていくつかの端末でレイアウト崩れが起こるなどの原因になります。

また、拡大よりは縮小の方が画像の劣化を抑えられるので、少し大きめの解像度で対応するのが良いですが、大きすぎるとメモリエラーの原因になるので横は600程度が望ましいかと思います。

 

2、アイフォンと同じ部品はNG

アイフォンのデザインをそのまま移行してくるアプリというのは後を絶ちません。アイフォンは使う事自体がステータス的な事もあり、使いづらいとしてもユーザーはそれに適合しようとしてきます。

ですが、アンドロイドに持ってきた場合に、使いづらい・分かりづらいインターフェースはクレームの原因になります。

アイフォンを持っている人はアイフォンをスタンダードに考えますが、多くのユーザーはアイフォンを持ってないからアンドロイドを持っているのです。アイフォンからの移行だったとしても分かりやすく、使いやすいデザインを別途アンドロイドで用意しましょう。

 

3、デフォルトのコンポーネントは使わない

一応、設定や細かい機能についてはコンポーネントを使っても問題ないと思います

何が問題かと言うと、androidのバージョンや端末で形・色が異なります。ボタンの押した時の色もオレンジの端末や青くなる端末などあり、デザインの統一性が保ちづらくなります。うまく組み込めるのであれば使っても問題はありませんが、もしデザインでこだわっているのであれば、デフォルトのデザインは使わないべきです。

デザインが得意でない人でも、無料の素材なども多くありますので、使ってみると他のアプリとの差別化ができると思います。

※下記ではいくつかの無料素材が紹介してありますね。

無料で使えるUIデザインの基本要素が詰まった32の素材集

 

デザインについて、プログラマーの立場からでも参加する場合には上記を留意して話しを進めると、より品質の高いものができるのではないでしょうか。

カテゴリー:アプリ制作

定番アンドロイドアプリを引きずり下ろす作戦

2012.05.30

androidも2.1以前を使っているユーザーも、そろそろ1割を切ってきたかと思います。(2012年5月)

 

この時点で思い切って、android2.2~、android2.3~だけに絞った開発をしてもよいのかと思います。

現在多くの有名アプリがandroid1.7くらいからをサポートしてます。そろそろ世代交代をしてもいい時期です。

 

その為には、androidのバージョンの新機能を確認して以前には利用できなかった機能を充実させる事が大きな一歩かと思います。

 

今だからこそ確認する新機能 ↓

 

■開発者が知っておきたいAndroid 2.2の新機能12連発

まず、上記のサイトから、android2.2の新機能を確認してみます。

【1】Flash Player 10.1 for Android
個人的見解:☆★★
あまりflashに卒倒しない方がよいかと。

 

【2】アプリが外部ストレージに置けるように
個人的見解:☆★★
よくユーザーコメントであるSDカードに置きたいっていう要望はこれのせい。
外部におくと動かない機能もあるので注意

 

【3】クラウド向けデータバックアップ用API
個人的見解:☆★★
端末が違っても、ユーザーのデータ引継ぎが可能。
引き継ぎたい時には、使うのがマストになります。

 

【4】OpenGL ES 2.0などグラフィックスの強化
個人的見解:☆☆★
OpenGLは以前でも使えていたので、それで物足りなければ。

 

【5】音声やマルチメディアの強化
個人的見解:☆☆★
ユーザービリティの向上。

 

【6】音声認識強化とサードパーティ製エンジン
個人的見解:☆☆★
ちょっとだけ、準備などに時間がかかったり、
いじりずらかったりする。

 

【7】カメラとビデオの強化
個人的見解:☆☆☆
カメラ周りのユーザビリティ強化
例えば、人気アプリ(古いバージョンも対応)で落ちます・遅い
とか出てたら、これで強化したアプリで差別化ができます。

 

【8】デバイスポリシーマネージャの追加
個人的見解:☆☆★
デバイス上のセキュリティ機能をコントロール
セキュリティ周りはユーザーの要望も大きいが、失敗のリスクも大きそう。

 

【9】カーナビも視野に入れたUIフレームワークの変更
個人的見解:☆★★
ちら見でも、分かりやすいようなデフォルトのデザイン。
デフォルトのデザインを使わない場合は当てはまらないかも。

 

【10】アカウントと同期のサポート
不明である。

 

【11】新しいマニフェスト要素と属性の追加
個人的見解:☆★★
application要素に新設された属性。trueかfalseで指定し、falseが指定された場合は、
アプリ実行時にJITコンパイラによる最適化が使用されない

JITコンパイラ

基本trueでいいと思います。

 

【12】新設されたパーミッション
個人的見解:☆☆★

・android.permission.BIND_DEVICE_ADMIN    
すべてのデバイス管理向けブロードキャストレシーバー

・android.permission.KILL_BACKGROUND_PROCESS    
ActivityManager#killBackgroundProcessを使用してバックグラウンドプロセスを終了させる場合は、
このパーミッションが必要
最初にこれで全てのバックグラウンドを殺してから動作してサクサクにしてもいいのかもしれない。

・android.permission.BIND_WALLPAPER    
すべてのWallpaperServiceを継承したサービスは、このパーミッションが必要。
Android 2.1では必要なかった

・android.permission.SET_TIME    
システム時間を設定する。
逆にこれだけでアプリになる。

http://developer.android.com/sdk/api_diff/8/changes.htmlが参考になります。

 

次にandroid2.2に関してもメインユーザーは日本ではIS03と初代のxeperiaくらいで、

全体のユーザーの2割程度だったかと思うので(今後更に減少します)

android2.3~の新機能も確認したいと思います。

 

開発者が知って得するAndroid 2.3の新機能18選

を基に確認します。

 

【1】3Dモーション処理のためのジャイロ改善
個人的見解:☆★★
改善なので、以前も使えた処理ですね。ですが、改善されているようなので、
ユーザーのminSDKをandroid2.3~にすれば、無駄に低いバージョンからのクレームを
避ける事ができます。

 

【2】おサイフ機能もできるNFC(近接場通信)
個人的見解:☆☆★
楽しい部分ではありますが、全ての機種をサポートしている訳ではないので、
今までにない機能として面白みはあります

 

【3】複数のカメラを扱えるAPI
個人的見解:☆★★
ひとつしかないもの、ないものもあるのでそんなに拡散の期待はできないかも。

 

【4】ネイティブの入力とセンサイベント
【5】アセットとストレージへのネイティブアクセス
【6】Activityライフサイクルのネイティブアクセス
【7】ウィンドウ管理
【8】グラフィック管理
【9】ネイティブでのオーディオ制御のためのオープンAPI
NDKとかのことかな??

 

【10】和音可能なオーディオエフェクト
個人的見解:☆☆☆
音量均等化や低音強化、ヘッドホン仮想化(サウンドステージの拡大)、
および電気的に付加された残響をオーディオトラックと音に加える
この新しい機能でclear voice recorderを作成しました。

 

【11】新しいフォーマットのサポート
ビデオ圧縮フォーマット「VP8」とオープンソースの動画規格「WebM」をサポートします。
需要の具合が不明

 

【12】SIPのインターネット通話
Android 2.3では、SIP(Session Initiation Protocol)をサポートします。
ユーザーは、SIPアカウントを持っている他のユーザーにインターネット上で音声通話を行えます。
とある、ちょっと不明

 

【13】ユーザーインターフェイスの改良
個人的見解:☆★★
発想には結びつかない。。

 

【14】テキスト入力とマルチタッチ
個人的見解:☆★★
アプリの修正なので発想には。。

 

【15】ワンタッチ単語選択とコピー&ペースト
個人的見解:☆★★
アプリの修正なので発想には。。

 

【16】バッテリ管理の改善
個人的見解:☆☆★
Android 2.3では、ユーザーにシステムコンポーネントとアプリの電力消費状況を可視化します。
APIにもよるが、メモリ使いすぎの犯人をつきとめられるので、そのアプリ検出や、
自分のアプリのメモリを使いすぎないようにしたりできる。

 

【17】アプリの制御
個人的見解:☆★★
ホームアプリの変更なので。。

以上です。

あんまりよい機能がないと思う人、自分なりにピンときた人さまざまだと思いますが、誰も気づかない自分にとってのメリットをアプリに生かせれば、多くの人が喜ぶアプリになりえると思います。

頑張って、アンドロイドを盛り上げていきましょう。

カテゴリー:アプリ制作

[1話完結]指示系アプリを作ってみよう。(Threadを使う)

2012.05.21

今回、いいネタが思いついたのでカンタンにアプリを作成してみたいと思います。

公開はしないのですが、勉強向きかと思いますのでソースコードも全て公開します。

 

ロングブレス[NAVERまとめ]

 

今回はこのロングブレスを手伝ってくれるアプリがいいかな。と思います。

ロングブレスとは

1.足を交差させ、後ろに90%体重をかける。おしりをしめる。(えくぼをつくる。)
2.3秒鼻から吸い、7秒かけて口から出す。このときに息が聞こえるくらいの強さで吐き出す。
これを6セット。

2つめ
1.両足をそろえ、一度背伸びをし、おしりに力を。
2.お腹に常にへこませるよう力を入れつつ1つめと同様3秒で息を吸い、7秒かけて出す。
これを6セット。

をするとよいらしいです。

一応、著作権とかありそうなので、開発のコードだけ書きますので、各々自分の環境で作ってみてください。

今回はどのようなアプリにするかと言うと、文字で指示を出していくアプリです。

こんな感じ↓

地味ですいません。。

minSDKをandroid2.2-にしてますがそれ以下でも大丈夫かと思います。

テーマを使うとカンタンに、他のアプリと違った見栄えのアプリが作れるので、今回はテーマを使ってみます。(タイトルを消します!)

テーマの利用はマニフェストだけ使えばOKです

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="info.dorodoro.longbress"
 android:versionCode="1"
 android:versionName="1.0" >
 <uses-sdk android:minSdkVersion="8" />
 <application
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name" >
 <activity
 android:label="@string/app_name"
 android:name=".LONGBRESSActivity"
 android:theme="@android:style/Theme.Black.NoTitleBar" >
 <intent-filter >
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER" />
 </intent-filter>
 </activity>
 </application>
</manifest>

とandroid:theme=”@android:style/Theme.Black.NoTitleBar”を付け加えます。

アプリをつけたら、ゆっくりしゃべっているように文字が切り替わる仕様にしたいので↓のような事を最初に考えておきます。

[立ち上がって、足を交差させ、後ろに90%体重をかけてください。]
3second
[おしりをしめてください。]
3second
[3秒鼻から吸い、7秒かけて口から出すのを6セットします。]
[
3second
[鼻から息を吸ってください]
7second
[口から出してください。]
]ここを6回。
[足を揃えてください。]
3second
[おしりをしめてください。]
3second
[3秒鼻から吸い、7秒かけて口から出すのを6セットします。]
[
3second
[鼻から息を吸ってください]
7second
[口から出してください。]
]ここを6回。

[お疲れさまです。]
3sec

終了

何秒待って、次の指示出して、何秒待って。と言う繰り返しです。

layoutは文字が中央に浮いているように設定します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:gravity="center"
 android:orientation="vertical" >

 <TextView
 android:id="@+id/tv1"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/hello" />

</LinearLayout>

テキストにThreadで順番にテキストをいれていきます。

((TextView)findViewById(R.id.tv1)).setText("LONG BRESS");
try {Thread.sleep(3000);} catch (InterruptedException e) {}
((TextView)findViewById(R.id.tv1)).setText("立ち上がって、足を交差させ、後ろに90%体重をかけてください");

上記は「LONG BRESS」を入れて3秒後に「立ち上がって、足を交差させ、後ろに90%体重をかけてください」と出力をするプログラムです。

ですが、これをonCreateの中に直接書くとonCreate中に3秒時間がかかっているとみなされて、「LONG BRESS」が出力されずに、「立ち上がって、足を交差させ、後ろに90%体重をかけてください」が出力されます!onCreateが終わってから表示がはじまるのが原因です。

これはJAVAがsingleThreadであることに起因するので、別Threadとして実行すれば、問題ないのでHandlerを用意します。

new Thread(new Runnable() {
 public void run() {
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("LONGBRESS");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("立ち上がって、足を交差させ、後ろに90%体重をかけてください");
 }
 });
 }
}).start();

ちょっとモノモノしくなってきましたが、これでほぼ実装は完了です。テキストを表示して、Threadで休んで、テキストを表示してを繰り返していきます。これをonCreateの中にでもいれれば、その通りに動作します。(コードは最後に記載します。)

見た目は地味ですが、うまく活用すれば、いろいろな可能性のあるアプリになりうると思います。

文字に従えば、カンタンダイエットできます。

是非、素敵なアプリを作る参考にしてみてください。

 

コード

package info.dorodoro.longbress;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class LONGBRESSActivity extends Activity {
 /** Called when the activity is first created. */
 Handler _handler = new Handler();

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
 new Thread(new Runnable() {
 public void run() {
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("LONGBRESS");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("立ち上がって、足を交差させ、後ろに90%体重をかけてください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("おしりをしめてください。");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("3秒鼻から吸い、7秒かけて口から出すのを6セットします。");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("次のプログラムに移ります。");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("足を揃えてください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("おしりをしめてください。");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("3秒鼻から吸い、7秒かけて口から出すのを6セットします。");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("鼻から息を吸ってください");
 }
 });
 try {Thread.sleep(3000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("口から出してください。");
 }
 });
 try {Thread.sleep(7000);} catch (InterruptedException e) {}
 _handler.post(new Runnable() {
 public void run() {
 ((TextView)findViewById(R.id.tv1)).setText("お疲れさまです。以上でプログラムは終了です。");
 }
 });
 }
 }).start();
//_tv.setText("立ち上がって、足を交差させ、後ろに90%体重をかけてください");
 }
}

カテゴリー:アプリ制作

ここにいるよアプリの失敗に学ぶ

2012.05.08

一年程前に制作した「ここにいるよアプリ」ですが、ダウンロード数は1500程度で現在は更新が止まっております。

ここにいるよアプリ

1500程度は無料では失敗だと思います。バナーを貼ったのですが、ほとんど機能もしてない状態です。やはり、10万ダウンロードを目標にしたいです。

 

失敗の原因の検証してみたいと思います。

1、精度の問題

現在、androidに搭載されているGPSですが、
室内だとNG、GPSをONにしてないとNG、
また、回線から位置を取得だとアバウトすぎて、
渋谷なのに神奈川の川崎と表示された時もありました。
常に取得(10分毎)と言う手もあったのですが、
電池の消費量を考ええると、どうしてもできませんでした。
これがレビューで一番に書かれてしまいました。

 

2、表示速度

マップの表示にかなり時間がかかってしまいました。
google mapだと、1秒程度で表示されるのに、数秒かかってしまいました。
僕の設定が悪いのかと思うのですが、
また、位置情報の名称の取得をgoogleで提供されているAPIで行ったのですが、
レスポンスが悪く取得できない時もありました(昨年5月)
GPSでの取得も加えると、10秒程度かかってしまう時もあり、尚且つ精度が悪かったのです。

 

3、アイコンの魅力

アプリを落とす時に、大きな動機になるのは、
グラフィックのキレイさと、アイコンの魅力だと思います。
その店で、赤白の2色の丸いアイコンにしたのですが、
リッチというよりチープが強くなってしまったかと思います。

 

4、言葉の有効性

待ち合わせをする場合に、はじめての土地に行った場合には地図で表示する事が
多いのですが、渋谷ハチ公前での待ち合わせで地図を添付する人はいないと思います。
手軽に待ち合わせに使えると思ったのですが、手軽な場所は地図なんていらなかったのです。

 

5、ツイッターで使ったサービスの画像の画質

多くのツイッタークライアントはまだ、外部の画像サービス経由で、
画像をアップロードをするのですが、解像度の高い画像をアップすると、
縮小表示されて、画質があれます。クリックをすれば拡大表示するのですが、
拡大表示をするのは割と面倒であり、汚い画質が露呈してしまう事がわかりました。
解像度は小さく、画質は高くを心がけるべきでした。

 

6、告知の量が小さかった。

個人的な激務を理由に告知を怠り、現在もこのブログで、開発した
アプリがどれか分からない状態だったりもします。
少し回りにずうずうしいくらいに告知をして、とりあえずダウンロードだけでも
してもらえたらよかったかと思っています。

 

7、keystoreファイルをなくした。

愚の骨頂です。生まれてきてすいません。
更新ができないです。

 

まとめ

keystoreをgoogle driveにいれて、いつでも使える状態に進化したので、
この反省を後のアプリに生かしたいと思います。

カテゴリー:アプリ制作

公開中のアプリ、是非ダウンロードしてみてください

2chまとめのたね

RSSを利用してさまざまなブログの情報をキュレーションしてくれるアプリ

インストールする

ひらがな戦記

OPENGL ES2 を利用したカルタのソーシャルゲーム

インストールする