ClipboardManagerの挙動変更?

Galaxy Nexusが12/2に発売されまして、早速「10Kすぷりったー」の挙動を確認してみました。

最初に動かしたときは正常に動いて「よしよし」と思ったのですが、環境を作り直して確認したところ起動時にNullPointerExceptionが発生するようになっていました。再現率100%です。

発生箇所を確認してみると、ClipboardManagerから文字列を取得してる処理で死んでいました。

ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
String clipboardValue = cm.getText().toString(); // ここで死ぬ

ClipboardManagerを確認したところ、上記で使用しているandroid.text.ClipboardManagerがdeprecatedになっていて、代わりにandroid.content.ClipboardManagerが追加されていました。

従来のClipboardManagerがテキストのみを扱っていたのに対し、新しいClipboardManagerはClipDataというクラスのインスタンスを返すように変更されています。

ここからは、Galaxy NexusとNexus Oneの挙動からの推測です。

以前はClipboardManager#getText()で必ず非nullの値(空値もしくはクリップボードの値)が返却されていました。少なくともNexus Oneではそういった挙動をしていて、再起動直後でも空値が返ってくるようになっていました。このため、これまでは「cm.getText().toString()」という横着したコードで済ませていました。

これがGalaxy Nexusでは「クリップボードに値が入っていない場合はnullを返す」ように変わったようです。(Android 4.0からなのか、3.0からなのかは未確認)
このため、クリップボードへ値が入っていないときに「cm.getText()」がnullとなり、そのnullに対して「toString()」を叩いたためNullPointerException、という流れになっています。

問題の箇所の修正ですが、とりあえず以下のように修正して凌ぎました。

ClipboardManager cm = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
String clipboardValue = (cm.getText() != null) ? cm.getText().toString() : “”;

10Kすぷりったー

(2011/06/14 1.1版)
Android用アプリ「10Kすぷりったー」を公開しました。
数字を万進法(万、億、兆…)表記に変換する電卓アプリです。マッシュルームにも対応しています。
アプリは、「https://market.android.com/details?id=net.kisato.tenthousplitter」からインストールできます。


続きを読む 10Kすぷりったー