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() : “”;


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください