コピー&ペースト

Android 13 以降では、クリップボードにコンテンツが追加されると、そのことをユーザーが視覚的に確認できるよう、標準のポップアップが表示されます。この新しい通知機能により、次のことが可能になります。

  • コンテンツが正常にコピーされたことをユーザーに知らせる。
  • コピーされたコンテンツのプレビューを表示する。

Android 12L(API レベル 32)以前では多くの場合、コンテンツをどの時点でコピーできたか、また何をコピーをしたかをユーザーが確認できませんでした。

この機能により、コピー後にアプリに表示されるさまざまな通知が標準化され、ユーザーがクリップボードを細かく制御できるようになります。

コピー / 貼り付けウィジェット
図 1: コンテンツがクリップボードに入ると表示される新しい UI
コピー / 貼り付けウィジェットの構造: クロスデバイスのプレビュー、共有、送信
図 2: コピー / 貼り付けウィジェットの構造: クロスデバイスのプレビュー、共有、送信

通知の重複を避ける

情報が重複して表示されないように、Android 13 以上のアプリ内コピーの後に表示されるポップアップ通知は、削除することを強くおすすめします。

アプリ内コピーの後にスナックバーを表示する
図 3: Android 13 でコピー確認スナックバーを表示させると、ユーザーにはメッセージが重複して表示されます。
アプリ内コピーの後にトーストを表示する
図 4: Android 13 でコピー確認トーストを表示させると、ユーザーにはメッセージが重複して表示されます。

Android 13 でコピー確認 UI が重複しないようにするには、この例のようなコードを使用します。


  fun textCopyThenPost(textCopied:String) {
    val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
    // When setting the clip board text.
    clipboardManager.setPrimaryClip(ClipData.newPlainText("", textCopied))
    // Only show a toast for Android 12 and lower.
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2)
      Toast.makeText(context, “Copied”, Toast.LENGTH_SHORT).show()
  }

Android 13 以上では、テキストがクリップボードにコピーされた後のポップアップ メッセージを含める必要はありません。

機密コンテンツをクリップボードに追加する

パスワードやクレジット カード情報などの機密コンテンツを、アプリ内でクリップボードにコピーできるようにする場合は、ClipboardManager#setPrimaryClip() を呼び出す前に、ClipData の ClipDescription にフラグを追加する必要があります。このフラグを追加すると、コンテンツのプレビューに機密コンテンツが表示されなくなります。

機密コンテンツのフラグを設定せずにコピーされたテキストのプレビュー
図 5: 機密コンテンツのフラグを設定せずにコピーされたテキストのプレビュー
機密コンテンツのフラグを設定してコピーされたテキストのプレビュー
図 6: 機密コンテンツのフラグを設定してコピーされたテキストのプレビュー

機密コンテンツのフラグを設定するには、ClipDescription にブール型のエクストラを追加します。対象 API レベルにかかわらず、すべてのアプリでこれを行う必要があります。


// When your app targets API level 33 or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app targets a lower API level
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}