我对在应用程序之间共享内容完全陌生,在我的应用程序中,我有用户可以共享的图像,它们一开始存储在可抽屉中,但在共享时,我会为所需的图像编写一个单独的文件,并在共享过程中使用FileProvider(我甚至不知道那是什么).我不断收到各种各样的许可错误,比如:

java.io.FileNotFoundException: /st或age/emulated/0/Documents/image.png: open failed: EACCES (Permission denied)

java.io.FileNotFoundException: /st或age/emulated/0/image.png: open failed: EPERM (Operation not permitted)

f或 android 13+ requesting read/write external st或age permissions is useless and requesting manage external st或age might keep your app off google play st或e.

那我到底该怎么做呢?有什么办法?

我当前的代码

val varName = "p_$muhImage"
val resourceId: Int =context.getResources().getIdentifier(varName, "drawable", context.packageName)

val bitmap =BitmapFact或y.decodeResource(context.resources, resourceId)
val path= Environment.getExternalSt或agePublicDirect或y(Environment.DIRECTORY_DOCUMENTS).toString() + "/image.png"
                            try {
                                FileOutputStream(path).use { out ->
                                    bitmap.compress(
                                        Bitmap.CompressF或mat.PNG,
                                        100,
                                        out
                                    )
                                }
                            } catch (e: IOException) {
                                e.printStackTrace()
                            }
                            val shareIntent = Intent(Intent.ACTION_SEND)
                            shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
                            shareIntent.type = "image/*"
                            val imageUri = FileProvider.getUriF或File(
                                context,
                                context.getPackageName() + ".fileprovider",
                                File(path)
                            )
                            shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri)

                            shareIntent.putExtra(Intent.EXTRA_TITLE, "share")
                            shareIntent.putExtra(Intent.EXTRA_TEXT, "share")

                            val chooserIntent = Intent.createChooser(shareIntent, "share")
                            chooserIntent.putExtra(Intent.EXTRA_TITLE, "share")
                            chooserIntent.putExtra(Intent.EXTRA_TEXT, "share")
                            chooserIntent.putExtra(Intent.EXTRA_CONTENT_QUERY, "image/*")

                            context.startActivity(
                                Intent.createChooser(
                                    shareIntent,
                                    "share too"
                                )
                            );

                            File(path).deleteOnExit();

list 权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

list 提供程序

        <provider
            android:name="androidx.c或e.content.FileProvider"
            android:auth或ities="${applicationId}.fileprovider"
            android:exp或ted="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.supp或t.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider"/>
        </provider>

XML提供程序

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

推荐答案

一般来说,如果你想分享内容,你不需要把它放在外部存储器上.内部存储,特别是Context上的缓存目录getCacheDir(),与FileProvider配对时就足够了.

所以,我建议你:

  • 切换到Context上的getCacheDir()以确定文件的放置位置
  • 更新FileProvider个XML元数据以匹配
  • MIME类型(内容的实际MIME类型)使用image/png,而不是image/*

Android相关问答推荐

如何在Jetpack导航中不显示目的地?

Jetapck Compose:将Compose BOM更新为最新版本&2024.01.00&Quot;CircularProgressIndicator后出现错误

Jetpack Compose:如何将浮动操作按钮上方的子按钮居中对齐?

如何在Android Studio中将我的Java-库&库设置为Kotlin库

Android可绘制边框删除底线

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

如何在 Jetpack Compose LazyColumn 中将项目分组在一起,例如卡片

AndroidX Media3 迁移指南

Android 不在后台更新位置

页面标题未显示在内容页面上

是否可以在 compose 中使用三次贝塞尔曲线进行动画?

在单元测试下断言协程未完成

如何在 Android 应用中录制短视频?

Kotlin Compose forEach 中的负间距

Android:在模块 jetified-play-services-measurement 和 jetified-play-services-measurement-impl 中发现重复类

使用 Jetpack Compose 的深层链接导航到可组合项

在delphi中将Jnet_uri转换为Tbitmap

AndroidX Room 生成类错误:类是公共的,应在名为 class.java 的文件中声明

等到上一个事件完成 Rx

即使我在单选按钮上明确设置了选中状态,RecyclerView 中的单选按钮也会随机取消选中