Java
Android

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

↓これの事

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


ライブラリ


  • 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>


参考