Developer PSA: Please Fix Your Clipboard Handling
AndroidPolice reported on a fairly unpleasant bug in Android 4.3. Until such time as a fix is rolled out in a patch release, developers should add some more smarts to the clipboard handling in their projects.
What the Bug Is
The bug stems from the clipboard monitoring behaviors added
ClipboardManager in API Level 11, combined with the
App Ops stuff that
I blogged about earlier.
If an app has used
addPrimaryClipChangedListener(), any other app
that tries to paste to the clipboard will crash.
The first crash will be a
java.lang.SecurityException: uid ... does not have android.permission.UPDATE_APP_OPS_STATS
The second and subsequent times this occurs on the device, it will be
java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast
The only resolution is to unregister the clipboard listener… and hope that the first crash has not occurred. If it has, a full reboot of the device is required to fix the broken system.
If Your App Monitors the Clipboard…
In principle, if you only monitor the clipboard in the foreground,
register for it in
onResume() and remove it in
In practice, you are probably not monitoring the clipboard in the foreground, as you would be the only likely one to be putting anything in the clipboard at that point.
If you have a long-running service that is monitoring the clipboard, please ensure that the users have an easy way to stop that behavior, even if it means stopping your whole service. Yes, this may mean that your app has seriously degraded functionality. However, the alternative is that the user has to keep rebooting their device while your app is installed, and if they have to remove your app, they might well elect to put some choice comments in the Play Store as well.
If Your App Pastes to the Clipboard…
If you are pasting to the clipboard, with
setPrimaryClip() or the
setText(), you will want to throw a
around those calls, so you catch the
RuntimeExceptions that will
However, you will need to tell your users that they are now fairly well screwed, needing to both find the clipboard-monitoring app and learn how to control it (or uninstall/disable it, if needed), plus reboot their device, in order to paste to the clipboard again.
IOW, even though your app has not done anything wrong, you have to be the bearer of the bad news.
Want an expert opinion on your Android app architecture decisions? Perhaps Mark Murphy can help!