LoginSignup
8
2

More than 5 years have passed since last update.

[Android]ShareCompatを使ってシェア(共有)する場合の画像の渡し方、コールバックの受け取り方

Last updated at Posted at 2019-04-14

↓これの事

わりとたくさん情報がありそうな気がしたが、意外と出てこなかったので、メモ書き。

ライブラリ

  • com.android.support:support-compat:28.0.0

実装

SomeActivity.java
// アクティビティ内から実行する前提のコード
private void showShareChooser() {
    File tempFile = new File(getApplicationContext().getExternalCacheDir(), tempImgFilePath);

    // ファイルをシェアするためにURIを取得する場合は、FileProviderを通じて、後述するオーソリティの名前を指定して取得する必要がある
    Uri uri = FileProvider.getUriForFile(getApplicationContext()
            , getApplicationContext().getPackageName() + ".provider"
            , tempFile);

    ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(this);
    builder.setChooserTitle(chooserTitle) // シェアする時のタイトル
            .setSubject(subject) // 件名。使われ方はシェアされた側のアプリによる
            .setText(text) // 本文。使われ方はシェアされた側のアプリによる
            .setStream(uri) // ファイルをシェアする時は、そのURIを指定
            .setType("image/jpeg"); // ストリームで指定したファイルのMIMEタイプ

    // URIに対する読み取り権限を付与する
    Intent intent = builder.createChooserIntent().addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    // コールバックを受け取りたい場合は、そのインテントを使ってアクティビティを開始する
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, SNS_SHARE);
    }

    // 結果を受け取らなくても良い場合は、ビルダーからそのまま開始できる
    // builder.startChooser();
}

戻りを受け取る場合は、 通常どおり onActivityResult で受け取れる。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case SNS_SHARE:
            // 戻りを受け取って何らか処理する
            // resultCode は必ずゼロになるので、 RESULT_OK で判定しない
            doSomething();
            break;

        default:
            super.onActivityResult(requestCode, resultCode, data);
            break;
    }
}

ファイルを共有する場合

画像などを共有する場合は、Bitmapをそのまま共有したりできないため、一旦ファイルに保存する必要がある。
また、以下のように保存先からの読み出しを許可する必要がある。

まず、パスをXMLで指定する。

src/main/res/xml/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-cache-path name="cache" path="." />
</paths>

external-cache-path などは保存先に応じて変わる。
英語だけどFileProviderの公式リファレンスを参照。
次に、そのプロバイダを AndroidManifest.xml で指定する。

AndroidManifest.xml
<manifest
    package="com.example"
    xmlns:android="http://schemas.android.com/apk/res/android">
:
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
:
    </application>
:
</manifest>

参考

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2