↓これの事
わりとたくさん情報がありそうな気がしたが、意外と出てこなかったので、メモ書き。
ライブラリ
- 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>