画像とテキストを共有するには (ShareActionProvider編)

Androidには使用頻度の高いサービスのアイコンを表示してくれるShareActionProviderと言うものがあります。これはアクションバーを使うので、.NoActionBarなテーマを使っている場合は、ツールバーを設定すれば使えるようになります。

menu/toolbar_share.xml

標準のシェアアイコンが自動的に表示されますが、カスタムは困難かも。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
            android:id="@+id/share"
            app:iconTint="@android:color/white"
            app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"
            app:showAsAction="ifRoom" />

</menu>

ShareActivity

import androidx.appcompat.widget.ShareActionProvider
3種類あるので、間違えずにAndroidX版をimportして下さい。

初回にACTION_SENDのインテントを渡せば完了。アイコンをクリックすればリスト形式で表示されます。

プレビュー機能はないようです。

private fun createShareIntent(): Intent {
    val text = "https://play.google.com/store/apps/details?id=$packageName"
    val type = "image/jpeg"
    val uri = Uri of image
            
    return Intent(Intent.ACTION_SEND)
        .putExtra(Intent.EXTRA_TEXT, text)
        .putExtra(Intent.EXTRA_STREAM, uri)
        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
        .setType(type)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setSupportActionBar(toolbar)
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.toolbar_share, menu)

    menu?.findItem(R.id.share)?.also {
        val provider = MenuItemCompat.getActionProvider(it) as? ShareActionProvider
        provider?.setShareIntent(createShareIntent())
    }

    return super.onCreateOptionsMenu(menu)
}