Android 6.0から導入された”Direct Share (ダイレクトシェア)”を無効化する方法を紹介します。
インテントファイアウォールで無効化
“Direct Share”とは、共有メニューでアプリにデータを渡すだけでなく、アプリ内にある連絡先などを選んで直接共有できる機能です。
例えばChromeで共有ボタンを押したとき、チャットアプリに登録した人を選んで共有するとその人に直接URLを書いたメッセージを送れます。
…ただ、普段から知人に共有することが多い人であれば便利でしょうが、めったに使わない人に取っては邪魔でしかありません。
Googleドライブのフォルダも表示されますが、普段よく使うフォルダが表示されるわけでもないので、普通にGoogle ドライブへ保存する方がフォルダを自由に選べて便利です。
幸い、この”Direct Share”はインテントファイアウォールと呼ばれる隠し機能で無効化できます。

インテントファイアウォールは/data/system/ifwにxmlファイルを置くことで有効化できるのですが、この操作にはroot権限が必要です。アップデートがある毎に書き換えるのは面倒なので、Magiskモジュールにしました。
ここからzipをダウンロードしてMagisk Managerでインストールし、再起動してください。
このモジュールは
<rules>
<service block="true" log="true">
<intent-filter>
<action name="android.service.chooser.ChooserTargetService" />
</intent-filter>
</service>
</rules>
と書かれたDisableDirectShare.xmlを一旦/system/etcに配置し、/data/system/ifwにシンボリックリンクを作成します。(直接/data/system/ifwに置くとモジュールを無効化しても残り続けてしまうため)
インテントファイアウォールは公式にはドキュメントが用意されていない隠し機能なので、一部の端末では対応していないこともあります。Android 9 PieのPixel 2 XLにて動作確認しています。
元々この方法はredditで公開されたものですが、xmlを見て分かるとおり、Direct Shareをブロックする目的以外でも利用できます。
アプリは動かしたいけれどバックグラウンドで動くのを止めさせたい時や、共有メニューに出てきて欲しくないものを消す時に、対象のアクション名を調べて別途追加すればそのアクションをブロックできます。
また、下記のようにすればアクティビティもブロックできます。activity
をservice
に書き換えればサービスもブロックできます。
<rules>
<activity block="true" log="false">
<component-filter name="com.android.dialer/.DialtactsActivity" />
</activity>
</rules>