[Android]Viewのスクリーンショットを取ってパーミッション使わずにシェアする

タイトル長い!

まぁ、あれです。

ストレージ権限を取らずに画像をシェアしたかったんです!

ってことでやり方!

キャッシュディレクトリに画像を保存してやって、その画像をシェアすれば良い!

以上!

ってことで実装!

スポンサーリンク

実装

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)
    })
}

タイトルとURLをコピーしました