Android 4.3 でコピーするとエラーが発生する現象について

java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast

Android4.3対応中に検出された上記のエラーについてですが、簡素な検証コードでもエラーが発生してしまいました。
バックグラウンドでクリップボードの監視をしていると落ちてしまいます。

まとめますと、aNdClip固有の問題ではなく、バックグラウンドでクリップボードを監視する機能を使用すると当現象が発生する状態、と認識しています。

OS側に修正が入らない限り、OnPrimaryClipChangedListenerを利用したクリップボードの監視を止めるしかないかもしれません。
方法としてはAndroid2.3以前の時のように定期的にポーリングするとかがありますが、今さら戻るなんて…。

今のところAndroid OS側のアップデートで修正されるものと考えています。
ですので大変申し訳ありませんが、OS4.3は一旦非対応となります。
2013/08/01 10:00追記
と考えていましたが、OSアップデートを待っていられないので、暫定対応として定期的にポーリングする方式(Android OS2.3以下と同様)に修正したバージョンを近いうちにリリース致します。

Google先生、これは仕様ではなくてバグですよね?

2013/08/07 00:00追記
Issue登録されてました。

2013/08/29 00:00追記
Nexus7(2013)はJSS15Qで修正されたようです。
シレっと直されると対応に困るのですがね…。

—————-
以下、検証の内容です。

■検証ソース
アプリを起動した後、戻るボタンでは無くホームキー押下などで他のアプリを開いて、コピーを実行するとコピーを実行したアプリ側で先頭のエラー(java.lang.IllegalStateException)が発生します。

■Activityのソース抜粋

public class MainActivity extends Activity implements OnPrimaryClipChangedListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
		cm.addPrimaryClipChangedListener(this);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();

		ClipboardManager cm = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
		cm.removePrimaryClipChangedListener(this);
	}

	@Override
	public void onPrimaryClipChanged() {
		Toast.makeText(this, "onPrimaryClipChanged", Toast.LENGTH_SHORT).show();
	}
}

単純に、クリップボードの監視をさせているだけのコードになります。
これだけでもエラーが発生してしまうので、アプリ側からは打つ手が見つかりません…。

Android 4.3対応中…

Android 4.3の機種で、クリップボードに値をセットしようとすると以下のようなエラーが出ているのを確認しています。
現時点で分かっている発生条件としては、

・クリップボードの値を変更する際に下記のエラーが発生する
・一度エラーが起きると、当該アプリをアンインストールしても再起動するまでコピーする度にエラーが発生する
・クリップボードの変更をフックするアプリが2つ以上ある場合?

Exception:
java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast
  at android.os.RemoteCallbackList.beginBroadcast(RemoteCallbackList.java:229)
  at com.android.server.ClipboardService.setPrimaryClip(ClipboardService.java:165)
  at android.content.IClipboard$Stub.onTransact(IClipboard.java:62)
  at com.android.server.ClipboardService.onTransact(ClipboardService.java:123)
  at android.os.Binder.execTransact(Binder.java:388)
  at dalvik.system.NativeStart.run(Native Method)
FATAL EXCEPTION: main
java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast
  at android.os.Parcel.readException(Parcel.java:1439)
  at android.os.Parcel.readException(Parcel.java:1385)
  at android.content.IClipboard$Stub$Proxy.setPrimaryClip(IClipboard.java:171)
  at android.content.ClipboardManager.setPrimaryClip(ClipboardManager.java:125)
  at com.amazing_create.android.andcliplib.common.g.a(Unknown Source)
  at com.amazing_create.android.andcliplib.fragments.av.a(Unknown Source)
  at com.amazing_create.android.andcliplib.fragments.j.onItemClick(Unknown Source)
  at android.widget.AdapterView.performItemClick(AdapterView.java:298)

とりあえずAndroidのソースを落として追ってみる事にします…。

アプリ紹介動画

いつもお世話になっている、アンドロイダーさまにアプリの紹介動画を作成して頂きました。感謝

プログラミングや画像はある程度作れても、動画作成となるとまた違った知識が必要になります。
自分はスペシャリストよりゼネラリスト派なので、将来的には動画も作成出来るようになりたいです。