'Share Intent for dynamic image in imageview without saving, using kotlin with little permissions as possible

I need to share the image in the imageView and the following code is promising (though not quite what I ) but returns some errors:

Kotlin:

    fun shareImage (iv: ImageView){
        val bitmap: Bitmap = iv.drawToBitmap()
        val imageName = "/image.jpg"
        try {
            File(this.cacheDir, "images").deleteRecursively()
            val cachePath = File(this.cacheDir, "images")
            cachePath.mkdirs()
            val stream = FileOutputStream("$cachePath$imageName")
            bitmap.compress(
                Bitmap.CompressFormat.JPEG,90,stream)
            stream.close()
        } catch (ex: Exception) {}

        // SHARE
        val imagePath = File(this.cacheDir, "images")
        val newFile = File(imagePath, imageName)
        val contentUri = FileProvider.getUriForFile(
            Objects.requireNonNull(getApplicationContext()),
            BuildConfig.APPLICATION_ID + ".provider", newFile);


        if (contentUri != null) {
            val shareIntent = Intent()
            shareIntent.action = Intent.ACTION_SEND
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            shareIntent.type ="image/jpeg"
            shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri)
            shareIntent.putExtra(Intent.EXTRA_TEXT, "This is a file for share")
            startActivity(Intent.createChooser(shareIntent, "Choose app"))
            grantUriPermission(
                packageName,
                contentUri,
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
            )

        }
    }

Manifest:

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

filepaths xml:

<paths>
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <cache-path
        name="cache"
        path="." />
    <external-cache-path
        name="external_cache"
        path="." />
    <files-path
        name="files"
        path="." />
</paths>

Result:

2022-05-14 13:10:36.179 18911-18941/com.user.application E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.user.application.provider/cache/images/image.jpg from pid=16214, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:832)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:694)
        at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:543)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:327)
        at android.os.Binder.execTransactInternal(Binder.java:1179)
        at android.os.Binder.execTransact(Binder.java:1143)
2022-05-14 13:10:36.196 18911-18926/com.user.application E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.user.application.provider/cache/images/image.jpg from pid=16214, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:832)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:694)
        at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:543)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:327)
        at android.os.Binder.execTransactInternal(Binder.java:1179)
        at android.os.Binder.execTransact(Binder.java:1143)
2022-05-14 13:10:36.326 18911-18941/com.user.application E/DatabaseUtils: Writing exception to parcel
    java.lang.SecurityException: Permission Denial: reading androidx.core.content.FileProvider uri content://com.user.application.provider/cache/images/image.jpg from pid=16214, uid=1000 requires the provider be exported, or grantUriPermission()
        at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:832)
        at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:694)
        at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:684)
        at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:543)
        at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:327)
        at android.os.Binder.execTransactInternal(Binder.java:1179)
        at android.os.Binder.execTransact(Binder.java:1143)

Even this doesn't work but it is not even close to what I require. I need to share the image in the imageView with 2022 Kotlin code (e.g. in previous popular answers MediaStore.Images.Media.insertImage is deprecated) without necessarily saving to device or at least without accessing external files.

I am having a hard time believing this is not a realistic expectation.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source