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:
4月 29


“Xperia Application Collection” という小冊子で私のアプリケーションを取り上げてもらっています。この小冊子はドコモショップや家電量販店のXperiaのコーナーへ行くと大量においてあるので目にしたことがあるひとも多いと思います。ドコモのXperiaに対する本気度を感じさせる仕上がりです。まだ手にしていないひとは是非入手してご覧になることをお勧めします。ちなみにWeb版もあります。

取り上げていただいた私のアプリは コールW FreeメールW Free の2つです。Xperia発売以来、マーケットでのダウンロード数は急上昇中です。このことから Xperia がかなり売れているんだなあと実感しています。先日(27日)ソフトバンクからも HTC-Desire が発売されたわけなのですが、こちらの方はどうなのでしょうか?初回の販売分は全て売れたような報道もありますのでそれなりに売れているのでしょう。今後、次々に発売されるであろうアンドロイド端末に期待したいところです。

ちなみに私の持っている携帯は?私はHT-03Aを発売日に買った口ですが、今も大事に使っています。会社で Nexsus One を買ってもらって使っているので自分で新しいのに乗り換える動機がそんなにないんですよね。というか何よりも先立つものが、、、そんなわけで、新しいアンドロイド端末が発売されるのを横目で見つつ次に何を買おうか考えているわけです。このプロセスが一番楽しいんですよね。

右の2つが私のアプリの紹介です。


Posted by sak

Tagged with:
4月 29

GW初日。

初めてのドメイン取得も無事終わり、基本的なサイトの枠組みもできあがってきたので、そろそろブログの記事も書き始めてみることにする。長続きさせるためにも最初から飛ばさず無理せず書いていくことを心がけて、


Posted by sak

preload preload preload