タイトル長い!
まぁ、あれです。
ストレージ権限を取らずに画像をシェアしたかったんです!
ってことでやり方!
キャッシュディレクトリに画像を保存してやって、その画像をシェアすれば良い!
以上!
ってことで実装!
実装
FileProvider用のxmlつくる
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<cache-path
name="shared_images"
path="images/" />
</paths>
マニフェストに書き書き
<!-- シェア用 -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="hoge.package.name.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
Viewのキャッシュを取ってUriを取得
// シェア用のUriを取得
fun Activity.getViewCacheContentUri(view: View): Uri {
view.isDrawingCacheEnabled = true
view.destroyDrawingCache()
val cache = view.drawingCache
val bitmap = Bitmap.createBitmap(cache)
view.isDrawingCacheEnabled = false
val cachePath = File(cacheDir, "images")
cachePath.mkdirs()
val filePath = File(cachePath, "share.png")
val fos = FileOutputStream(filePath.absolutePath)
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
fos.close()
return FileProvider.getUriForFile(this, "$packageName.fileprovider", filePath)
}
ViewのキャプチャにPixelCopy使っても良いと思うよ!
シェア!
// シェア
fun Activity.share(view: View, shareText: String) {
val contentUri = getViewCacheContentUri(view)
startActivity(Intent().apply {
action = Intent.ACTION_SEND
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
setDataAndType(contentUri, contentResolver.getType(contentUri))
putExtra(Intent.EXTRA_STREAM, contentUri)
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, shareText)
})
}