15

android.text.ClipboardManager was deprecated since API level 11, and replaced with android.content.ClipboardManager (source).

How do I write code that supports both cases? Importing android.content.ClipboardManager and using that works in 11+ but force closes in 10. Changing the import to android.text.ClipboardManager throws a bunch of deprecation warnings in 11+.

How can I handle both cases smoothly? What do I need to import?

Mike Crittenden
  • 5,659
  • 6
  • 44
  • 72

5 Answers5

7

I ended up just using the old way (android.text.ClipboardManager and the code from this answer), along with a couple @SuppressWarnings("deprecation") annotations.

Community
  • 1
  • 1
Mike Crittenden
  • 5,659
  • 6
  • 44
  • 72
6

Referring to this answer:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
final android.content.ClipboardManager clipboardManager = (android.content.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
final android.content.ClipData clipData = android.content.ClipData
        .newPlainText("text label", "text to clip");
clipboardManager.setPrimaryClip(clipData);
} else {
final android.text.ClipboardManager clipboardManager = (android.text.ClipboardManager) context
        .getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setText("text to clip");
}
Community
  • 1
  • 1
Beeing Jk
  • 3,596
  • 1
  • 16
  • 28
5

Explicitly:

    @SuppressWarnings("deprecation")
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
    clipboard.setText(shareViaSMSBody);

Since this has to keep working on older devices, it is likely that the deprecated code will not be removed from Android.

larham1
  • 11,169
  • 4
  • 34
  • 26
1

If you are still supporting < SDK 11 you are doing too much work. Set min to 15 and use this code:

 ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
 ClipData clip = ClipData.newPlainText("label for text", "text to copy");
 clipboard.setPrimaryClip(clip);
Codeversed
  • 8,967
  • 3
  • 41
  • 42
0

Reading the latest clipboard as text:

val clipboardManager = context.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
clipboardManager.addPrimaryClipChangedListener {
    val clipboardAsText = clipboardManager.primaryClip?.getItemAt(0)?.text
    if (clipboardAsText != null) {
        Toast.makeText(context, "Text in clipboard: $clipboardAsText", Toast.LENGTH_SHORT).show()
    }
}
Cristan
  • 9,210
  • 4
  • 58
  • 62