Androidで簡単にシェア(共有)機能実装。ShareCompat の覚え書き

Androidでシェア機能を作ろうとした場合、、、

  • Intentで全部自分で実装する
  • ShareCompat を使って実装
  • 外部の専用ライブラリを使う

主にこの3つの方法があります。

手軽で簡単なのが ShareCompat を使うこと

使い方も簡単だったので、
ここでは ShareCompat によるシェア機能の実装手順 まとめました。

アプリの宣伝・インストール数底上げにも役立ちそうです。

まず ShareCompat についてと、使う前の下準備

この ShareCompat は以下のような機能

▼ Android developers から引用

Extra helper functionality for sharing data between activities. ShareCompat provides functionality to extend the ACTION_SEND/ ACTION_SEND_MULTIPLE protocol and support retrieving more info about the activity that invoked a social sharing action.

引用元 : ShareCompat | Android デベロッパー

▼ この説明の超適当な意訳

アクティビティ間でデータを共有するためのヘルパー機能。ShareCompat は従来の ACTION_SEND/ ACTION_SEND_MULTIPLE を拡張し、SNSでのシェアアクションを呼び出したアクティビティに関する詳細情報の取得をサポートします。

もちろん共有アクティビティは "これなし" でも呼び出し可能

でも楽したいなら コッチを使う方がいいですね。

あとこれを使うにあたり、特別な準備もありません。

もちろん build.gradle とかの編集も不要です。(多分)

基本的なSNSシェア機能の実装手順&コード例

では早速これを使って、シェア機能を付けることに。

開発アプリでは次の用途で使いたかったです。

  • 自分のアプリを宣伝するため
  • 外部のSNSアプリを起動するため

少しでもアプリインストール数は伸ばしたいですよね。

そのために使ってみようって感じです。

とあるアプリに実装してみた手順は以下の通り

 

まず共有アプリ一覧を呼び出すメソッド定義してみました。

▼ こういうの

大事なポイントは次の2つ

  • 件名の設定
    上コードの setSubject(subject)  の部分。メールなら件名に表示されるが、Twitterとかだとあんまり意味ないらしい・・・
  • 本文の設定
    上コードの setText(bodyText)  の部分。メールでいう本文、Twitterなら日本語のみで140文字まで可能( 関連記事 => ツイート文字数とバイト数の関係

普通にシェアしてもらうだけなら、これでも十分です。

あとはメニュー項目なりがタッチされたときに起動させればOKです。

 

どういう動作とか見た目かについてですが・・・

ShareCompat が起動すると、こういうメニューが表示されます。

▼ Android7.0での見た目

Android7.0でShareCompatのシェア機能を呼び出してみた

▼ その中から Twitter をタッチしてみた

ShareCompatからTwitterを起動したときの様子。ツイートしたい内容が自動でセットされる

本文に設定したものが最初からツイート欄にセットされてます。

これを Intent だけでやろうとすると大変なんですよね・・・

こういう便利なライブラリは使わない手はありません。

シェア後の結果を startActivityForResult で受け取る

もしSNSシェア(共有)するだけではなく、、、

  • シェア後に何かトースト表示したい
  • 本当にシェアされたか知りたい

こういう場合は onActivityResult  で受け取ることも可能です。

そのやり方では以下の通り

 

1.先ほどのシェアコードを少しだけ書き変え

2.onActivityResult をオーバーライド

こうすればSNSシェア後に何かすることが可能

このテクニック(?)はAndroid開発では意外とよく使います。

ここまでのまとめ

シェア機能だったら Intent だけでも実装できるものの・・・

やっぱり ShareCompat の方が労力かからないし楽ですね。

あと変なバグ・エラーが入るリスクも最小限にできます。

以上、ShareCompat でシェア機能をAndroidアプリに付ける方法でした。

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

10件のコメント
  • 岡本優一

    こんにちは。毎度参考にさせていただいています!2つ質問があります!

    「シェア後の結果を startActivityForResult で受け取る」仕様にて

    (1つ目)
    resolveActivity の部分で “Consider adding a declaration to your manifest when calling this method”と言われます。

    これは、Manifest.xmlに何かで記述が必要なのでしょうか?

    今のところ、Shareまではウマく行っているのですが、結果を受け取った際のToast表示がされません。

    (2つ目)
    オーバーライド後の”break;”が”Break outside switch or loop”とというエラーになります。

    初心者の質問ですが、何卒ご指導よろしくお願いします!

    3月 6, 2021 3:17 pm
    • ぴー助

      コメントありがとうございます。

      1つめの resolveActivity で “Consider adnding a declaration…“ の部分ですが、特にManifest.xmlに記述は必要ありません。またbuild.gradleにも特別な記述なしで使えます。環境・バージョンによって異なるエラーが出ることもあるので、その確認が必要と思われます。

      2つめは記事側のミスでした・・・この場所で break; が来るのはおかしいですね。本来はswitch文を書いていたのですが、分かりやすさを優先してif文に置き換えた時に残っていたみたいです。後で訂正しておきます。

      ご指摘ありがとうございました!

      3月 7, 2021 8:33 am
      • 岡本 優一

        ご返事ありがとうございます!

        1つめ、記述なしでも使える件了解しました。

        2つめなのですが、RESULT_OK、つまり、例えばLINEなどでシェアした後に、Toastで「Thank you!」みたいなメッセージを表示させたいのですが、表示されません。他にAdMobのインタースティシャル広告の発火もするようにしたのですが、何も起こりません。。

        そもそも、私の理解が間違っているのでしょうか?。。

        重複しますが、シェア後にメッセージを表示したいのですが。。

        何かヒントございましたら、どうぞ宜しくお願い致します!

        3月 9, 2021 4:18 pm
        • ぴー助

          シェア画面が表示されるなら受け取り側でコード的な不備があるものと考えられます。この記事の内容は環境・他ライブラリには依存しないはずなので、コードを見直されることをオススメします。コメントありがとうございました!

          3月 9, 2021 5:17 pm
  • 岡本優一

    ぴー助さま、ご返事ありがとうございます!
    受け取り側のresultCode == RESULT_OK以下にトースト表示
    Toast toast = Toast.makeText(MainActivity.this,
    “シェアくださりありがとうございます!️”,
    Toast.LENGTH_LONG);
    toast.show();
    を入れているのですが、表示されないのです。。コードはぴー助さまの内容をコピペしているのですが。。

    3月 10, 2021 1:46 pm
    • ぴー助

      コードをコピペされたなら requestCode == REQUESTCODE_SNS_SHARE の部分はその環境に応じて書き変える必要があります。またトースト側の問題の可能性もあるので、Log.d() などを使って、実際にその部分が実行されているかの確認も必要ですね。これ以上はコード・環境が分からないのでアドバイスできません。開発頑張ってください!

      3月 10, 2021 3:23 pm
  • 岡本優一

    ぴー様

    ちょっとがんばって調べてみます。ありがとうございました!為になるサイトこれからも活用させていただきます!

    3月 10, 2021 5:26 pm
  • 岡本優一

    こんばんは。色々試したのですが、もしかして私の環境、APIレベル11では動かない可能性はありますか?

    3月 11, 2021 2:45 am
    • ぴー助

      その点については問題ないと思います。もし問題があるなら Android Studio などが警告・エラーを出してくれるはずなので、そうでないなら別の部分にエラー・バグがあるのかもしれません。

      3月 11, 2021 12:21 pm
  • 岡本優一

    ご返事ありがとうございます。
    APIレベル11(sdk30)で

    ”startActivityForResultがDeprecated”

    とあるのですが、これは関係ないのでしょうか??

    どうも、ぴー助様の通りやると、RESULT_CANCELEDしか返ってこない状況なのですが。。

    どうぞ宜しくお願い致します。
    毎度のご返事大変ありがとうございます!

    3月 11, 2021 6:13 pm

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください