【Sharing Shortcuts】
Androidの共有メニューに出る
「最近の連絡先」

Androidスマホで写真や記事を共有しようとすると、画面上部に「最近使った連絡先」のようなアイコンが並びます。

<svg class="eyecatch-svg" viewBox="0 0 192 192" xmlns="http://www.w3.org/2000/svg">
  <!-- 背景 -->
  <rect width="192" height="192" fill="white" rx="32" ry="32"/>
  
  <!-- Android頭部(左上) -->
  <g transform="translate(40, 40)">
    <!-- 頭部 -->
    <rect x="0" y="8" width="32" height="24" rx="4" fill="#9C27B0"/>
    <!-- アンテナ左 -->
    <line x1="8" y1="8" x2="4" y2="0" stroke="#9C27B0" stroke-width="3" stroke-linecap="round"/>
    <!-- アンテナ右 -->
    <line x1="24" y1="8" x2="28" y2="0" stroke="#9C27B0" stroke-width="3" stroke-linecap="round"/>
    <!-- 目左 -->
    <circle cx="10" cy="18" r="2" fill="white"/>
    <!-- 目右 -->
    <circle cx="22" cy="18" r="2" fill="white"/>
  </g>
  
  <!-- 共有アイコン(中央メイン) -->
  <g transform="translate(96, 96)">
    <!-- 中央ノード -->
    <circle cx="0" cy="0" r="12" fill="#2196F3" stroke="white" stroke-width="2"/>
    
    <!-- 接続線1(右上) -->
    <line x1="8" y1="-8" x2="28" y2="-28" stroke="#2196F3" stroke-width="4" stroke-linecap="round"/>
    <!-- ノード1 -->
    <circle cx="32" cy="-32" r="10" fill="#4CAF50" stroke="white" stroke-width="2"/>
    
    <!-- 接続線2(右下) -->
    <line x1="8" y1="8" x2="28" y2="28" stroke="#2196F3" stroke-width="4" stroke-linecap="round"/>
    <!-- ノード2 -->
    <circle cx="32" cy="32" r="10" fill="#FF9800" stroke="white" stroke-width="2"/>
    
    <!-- 接続線3(左) -->
    <line x1="-10" y1="0" x2="-30" y2="0" stroke="#2196F3" stroke-width="4" stroke-linecap="round"/>
    <!-- ノード3 -->
    <circle cx="-34" cy="0" r="10" fill="#F44336" stroke="white" stroke-width="2"/>
  </g>
  
  <!-- 連絡先カード1(右上) -->
  <g transform="translate(130, 50)">
    <rect x="0" y="0" width="28" height="28" rx="4" fill="#E0E0E0"/>
    <!-- 人物アイコン -->
    <circle cx="14" cy="10" r="5" fill="#607D8B"/>
    <path d="M 6 24 Q 14 18 22 24" fill="#607D8B"/>
  </g>
  
  <!-- 連絡先カード2(右下) -->
  <g transform="translate(130, 114)">
    <rect x="0" y="0" width="28" height="28" rx="4" fill="#E0E0E0"/>
    <!-- 人物アイコン -->
    <circle cx="14" cy="10" r="5" fill="#607D8B"/>
    <path d="M 6 24 Q 14 18 22 24" fill="#607D8B"/>
  </g>
  
  <!-- 連絡先カード3(左) -->
  <g transform="translate(34, 82)">
    <rect x="0" y="0" width="28" height="28" rx="4" fill="#E0E0E0"/>
    <!-- 人物アイコン -->
    <circle cx="14" cy="10" r="5" fill="#607D8B"/>
    <path d="M 6 24 Q 14 18 22 24" fill="#607D8B"/>
  </g>
  
  <!-- 設定歯車(左下) -->
  <g transform="translate(50, 140)">
    <circle cx="0" cy="0" r="10" fill="none" stroke="#9E9E9E" stroke-width="3"/>
    <!-- 歯車の歯 -->
    <rect x="-2" y="-14" width="4" height="6" rx="1" fill="#9E9E9E"/>
    <rect x="-2" y="8" width="4" height="6" rx="1" fill="#9E9E9E"/>
    <rect x="-14" y="-2" width="6" height="4" ry="1" fill="#9E9E9E"/>
    <rect x="8" y="-2" width="6" height="4" ry="1" fill="#9E9E9E"/>
    <!-- 中心 -->
    <circle cx="0" cy="0" r="4" fill="#9E9E9E"/>
  </g>
</svg>【Sharing Shortcuts】<br class="chiilabo-br is-on"> Androidの共有メニューに出る<br class="chiilabo-br is-on">「最近の連絡先」

便利な機能ではあるのですが、この連絡先はどこから来ているのでしょうか。
また、誰かに画面を見られたとき、共有メニューから最近やり取りした相手が分かってしまいます。これを表示しない設定はあるのでしょうか。

Sharing Shortcuts APIはAndroidの設計に深く組み込まれていて、設定ではオフにはできませんでした。

アプリごとのメッセージ送信のタイミングなどにシステムに共有先を登録されていて、削除するには(基本的には)アプリのユーザーデータを削除するしかありませんでした。

関連記事

1. 「Sharing Shortcuts API」という仕組み

LINEでやり取りした相手やGmailで最近メールを送った相手が表示されています。
中には、連絡先アプリに登録されていない人もいます(LINE友だちなどは特に)。
つまり、共有メニューは連絡先アプリとは別のところから情報を取得しているようです。

Androidには、「Sharing Shortcuts API」という機能があります。

Direct Share の仕組み LINE Gmail 他アプリ Android OS 共有メニュー 最近の候補を まとめて表示

これは、各アプリが「この人に共有される可能性が高い」という候補をAndroid OSに提供する仕組みです1
そして共有メニューを開いたとき、OSはこれらの候補をまとめて表示するのです。

Android 10(API level 29)で導入された、共有機能を高速化する新しいAPIです。

  • 旧Direct Share
    共有時にアプリに「今、候補を教えて」と要求(プルモデル)
    → 遅延発生
  • Sharing Shortcuts
    アプリが事前に候補を登録(プッシュモデル)
    → 即座に表示

例えば、LINEアプリは「最近トークした相手5人」をOSに教えます。
Gmailは「最近メールを送った相手」を教えます。

つまり、連絡先アプリの情報ではなく、各アプリが独自に提供した候補だったわけです。

  • Sharing Shortcuts APIはAndroidの設計に深く組み込まれている
  • システム全体で無効化する公式設定は提供されていない

GmailやLINEのストレージを削除すれば、候補を消去できます。
しかし、それではアプリが使えません。

アプリのキャッシュを消去したり、連絡先へのアクセス権限をオフにするだけではダメなのです。

なぜなら、各アプリが提供するSharing Shortcuts候補は、この設定とは独立して動作するからです。
LINEやGmailなどのアプリ側で候補を提供している限り、それらは表示され続けます。

1.1. 【開発者向け】アプリ内での実装

アプリ開発者であれば、以下のコードで自アプリの共有ショートカットを削除できます:

// すべての動的ショートカットを削除
ShortcutManagerCompat.removeAllDynamicShortcuts(context)

// 特定のショートカットのみ削除
ShortcutManagerCompat.removeDynamicShortcuts(
    context, 
    listOf("shortcut_id_1", "shortcut_id_2")
)Code language: JavaScript (javascript)

1.2. 【補足】古い端末ではDevice Personalization Services

Android 10以前の端末や一部のメーカー製スマホでは、「Device Personalization Services」という名前で同様の機能が提供されています2

設定アプリの「プライバシー」セクションに「デバイスのカスタマイズサービス」という項目があれば、それをオフにすることで予測機能を無効化できます。

2. まとめ:知ることで選択できる

今回の調査で分かったことを整理します。

Androidの共有メニューに表示される「最近の連絡先」は、各アプリが提供する候補とAndroidの予測機能が組み合わさったものです。連絡先アプリとは直接関係ありません。

完全にオフにする公式の方法はありませんが、Android System Intelligenceの使用状況アクセスを制限し、各アプリの権限を調整することで、表示を大幅に減らすことは可能です。

重要なのは、この仕組みを知っておくことです。知らずに使っていると、意図せずプライバシーに関わる情報が画面に表示されるかもしれません。一方で、仕組みを理解していれば、自分に合った設定を選べます。

私の場合、完全にはオフにせず、予測機能だけを制限する方法を選びました。これで利便性を保ちつつ、表示される候補を必要最小限に抑えられています。

あなたのスマホでも、一度設定を確認してみてはいかがでしょうか。

  1. Direct ShareはAndroid 6.0(API level 23)で導入され、Android 11以降はSharing Shortcuts APIに置き換えられました – Provide Direct Share targets | Android Developers
  2. Android 10ではSharing Shortcuts APIが導入され、Direct Shareの仕組みが大幅に改善されました。共有メニューの読み込み速度が劇的に向上し、30msで50%のユーザーが完全に読み込まれた状態を見られるようになりました – Google explains how much faster the Sharesheet is in Android 10 | Android Police