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() : “”;
コメントを残す