7月 15

ワイヤレスジャパン2010が東京ビックサイトで7/14〜16の日程で開催中です。私のアプリ『メールW Free』もシャープさんのブースでパネル展示するかも?という話しを聞いていたので出張と絡めて見に行くことを画策していたのですが、昨今の経費削減のあおりを受けて願いがかなえられませんでした。「ワイヤレスジャパン行きたかったな。なんか楽しそう。」そんなツイートをツイッターでしたところ、なんとA3の覇者、タオソフトウェアの @tao_gaku さんから、『メールW Free』のパネル展示の写真をツイッターの返信で送っていただきました。

最近、ワンセグがとても欲しいので、AU の IS01 に非常に興味が出てきているところなのですが、自分のアプリが紹介されている写真を見てこの機種がますます欲しくなりました。でも、ドコモの LYNX も発表まじかなのでそれまで様子見を決め込もうと思っています。2つの機種が同程度の条件で発売になったらどちらにしようか非常に迷うことになりそうです。ドコモの HT-03A と Xperia を既に持っているので AU Market の搭載されている IS01 にも惹かれますが、デザインと色的には LYNX の赤いやつの方が好みです。仕事柄ドコモびいきというのもあります。プライベートではHT-03A購入以前はアナログ時代から10年以上AUを使用していたんですけど、アンドロイド携帯が出るのが遅かったのでドコモに乗り換えちゃいました。ちょうど一年ほど前のHT-03Aの発売日(7/10)に。まー、LYNXが普通の価格で発売されれば悩まず IS01 なのですが、AUに対抗して ISデビュー割り相当の戦略的な価格設定をしてきた際には非常に悩むことになりそうです。今年はたくさんアンドロイド携帯が発表されるようなので、こんな悩みが増えそうですね。


Posted by sak

Tagged with:
5月 16

コールW Quad と メールW Quad を公開しました。ウィジェットアプリケーションです。ホーム画面に配置したイメージは以下のようになります。

コールW/メールWといえばこれまでに Free版(無料)、Pro版(¥100)とリリースして来ましたのでこれが第3弾となります。価格は¥250程度を考えていますが最初の100ダウンロードまでは特別価格¥100にします。是非、早めに入手してください。

機能はこれまでのコールW/メールWシリーズと同様でこれを使用することでそれぞれ予め登録した相手に簡単に電話やメールをすることができるようになります。今回の Quad では要望の強い省スペースを実現しました。1×1のウィジェットの中に4人までの連絡先が登録できます。

これまでリリースしたコールW/メールWシリーズのウィジェットを全てホーム画面に並べるとこうなります。

ちなみに コールW Quad は A3 への応募作品です。

実はゴールデンウィーク期間中、A3(Android Application Award 2010 Spring)にアプリを応募しようとずっとネタを考えていたのですが、なかなか思いつかずアプリの応募は既存の作品(コールW Pro)で行おうと思っていた矢先でした。ふと pcm2a さん作の More Icons Widget を使ってみて。急にひらめきました。素敵なアプリを開発した pcm2a さんに感謝します。

賞を取れるとは思っていませんが、これまで Android Developer Challenge などこの手の祭りには参加できていませんでしたので、今回は結果がでるまでは楽しみたいと思っています。


Posted by sak

Tagged with:
4月 30

といっても不具合修正です。

ことの発端

海外のユーザさんのコメント欄にやれ Droid で fc (force close=強制終了) しただの Hero で fc しただの書かれていましたが自分の環境では起きたこと無いし海外の端末の環境で起きる環境依存の不具合だろうくらいに思っていたのですが、最近になって日本のあるユーザさんから不具合をこの指摘するメールをいただきました。端末は私も愛用している HT-03A で発生したということです。何度かやり取りさせていただく中でエラーが発生した場面をわざわざビデオに収めて送っていただきました。証拠をつきつけられては逃げられません。よし直すか。といいつつも中々時間が取れずのびのびになっていました。GWに入り時間もようやく取れたのでやってみました。

まずは再現を

修正する前にまずは確実に再現する手順を見つけなくてはいけません。どうやらコンタクトのユーザ数が多いと出るらしいとのことだったのでまずはテスト用のユーザの作成です。ですが1件1件ユーザを登録していたのでは大変です。CSVファイルを用意して G-MAIL のインポートを使うことにしましょう。手順は以下の通りです。

  1. データを1件、手動で登録する。
  2. 登録した一旦エクスポートして CSVファイルのテンプレートとする。
  3. テンプレートを基に300件のデータを作るスクリプトを作成する。
  4. スクリプトを実行して、CSVファイルを作成する。
  5. CSVファイルをインポートする。
  6. データが端末と同期するのを待つ。

で、やってみたところ直ぐに現象を再現させることができました。確実に。

そして修正へ

症状からだいたいの辺りはついていたのですがソースを見て直ぐに気がつきました。close してない。コンタクトを表示するロジックの中で毎回コンテントプロバイダへのクエリを managedQuery を使用して実行してるわけなのですが close 処理が入っていません。試しに close を入れるとあら不思議、強制終了しなくなりました。以前、同じ失敗をしたことがあるのですがまたやってしまいました。

修正点は以下のコードに27行目の c.close(); を1行追加しただけです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    public class MyViewBinder implements SimpleCursorAdapter.ViewBinder {
       
//      @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex)
        {
            if ((columnIndex == cursor.getColumnIndex(ContactMethods.PERSON_ID) && !isEclair()) ||
                (columnIndex == cursor.getColumnIndex("photo_id") && isEclair())) {
                String[] projection_eclair = { "data15" };  // ContactsContract.CommonDataKinds.Photo.PHOTO
                String[] projection = { Photos.DATA };
               
                Uri content_uri = isEclair() ?
                        Uri.parse("content://com.android.contacts/data") :  // ContactsContract.Data.CONTENT_URI
                        Photos.CONTENT_URI;
               
                String _id = cursor.getString(columnIndex);
                if (_id == null) {
                    ((ImageView)view).setImageResource(R.drawable.ic_contact_picture);
                    return true;
                }
               
                int person_id = Integer.parseInt(_id);
                Uri uri = ContentUris.withAppendedId(content_uri, person_id);
               
                Cursor c = managedQuery(uri, isEclair() ? projection_eclair : projection, null, null, null);
                c.moveToFirst();
                byte[] photoData = c.getBlob(0);
                c.close();
               
                if (photoData != null)
                    ((ImageView)view).setImageBitmap(BitmapFactory.decodeByteArray(photoData, 0, photoData.length));
                else
                    ((ImageView)view).setImageResource(R.drawable.ic_contact_picture);
                return true;
       
            } else if ((columnIndex == cursor.getColumnIndex(ContactMethods.TYPE) && !isEclair()) ||
                       (columnIndex == cursor.getColumnIndex("data2") && isEclair())) {
                String type;
                int ntype = Integer.parseInt(cursor.getString(columnIndex));
                if (ntype == Phones.TYPE_MOBILE)        // 2
                    type = getString(R.string.type_mobile);
                else if (ntype == Phones.TYPE_HOME)     // 1
                    type = getString(R.string.type_home);
                else if (ntype == Phones.TYPE_WORK)     // 3
                    type = getString(R.string.type_work);
                else
                    type = getString(R.string.type_other);
                ((TextView)view).setText(type);
                return true;
            }
            return false;
        }
    }

他のアプリも同様に

コールW Free と同様に メールW Free, コールW Pro, メールW Pro にも同じ問題があったので修正しました。最後に修正したのが去年の12月ですからほぼ4ヶ月ぶりの更新です。

最後に

コードを修正した後、もしや?と思って修正前のアプリを自分の環境で試したところコンタクトの選択で強制終了が発生しました。問題はコンタクトのユーザ数ではなく、表示させたデータの数なのでした。(自分の環境はデータ数も少なくスクロールもそれほど必要なかったので気がつかなかったのですね。)結果的に不要な作業をやってしまったことになりますが、ブログ用のキャプチャー画像に利用できたし「結果オーライ」ってことで。


Posted by sak

Tagged with:
preload preload preload