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