kotlin Android图像共享意向-不支持文件格式

gorkyyrv  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(188)

数据类别:-

data class User(val imagepic: Int)

将值传递到回收程序视图:-

val users = ArrayList<User>()
    val adapter = CustomAdapter(users)
    recyclerView.adapter = adapter
    users.add(User(R.drawable.splash_bc))
    users.add(User(R.drawable.image))
    users.add(User(R.drawable.splash_bc))
    users.add(User(R.drawable.share))
    users.add(User(R.drawable.splash_bc))
    users.add(User(R.drawable.image))

回收程序视图中的my shareimage函数:-

fun sharepic(user: User) {
            var uri: Uri = Uri.parse(user.toString())
            Log.i(TAG, uri.toString())
            val intent = Intent(Intent.ACTION_SEND)
            intent.type = "image/*"
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.putExtra(Intent.EXTRA_STREAM, uri)
            startActivity(itemView.context, Intent.createChooser(intent, "Share Image"), null)
        }

获取错误:-文件格式不受支持。在检查logcat以查找URI时,获取此- I/ContentValues:用户(imagepic=2131165295) .
请帮助这一点。不知道为什么文件格式不支持。让我知道有没有其他方法来解决这个问题。

h5qlskok

h5qlskok1#

sharepic()有一些问题。
首先,您不能在Uri.parse()中使用任意字符串,并期望Android或其他应用程序能够理解它。默认情况下,user.toString()不会生成有效的Uri
第二,你没有一个文件。你有一个可绘制资源ID。可绘制资源是你开发机器上的一个文件。它不是电话上的一个文件。没有内置的共享可绘制资源的方法。
第三,可绘制资源有点随意。例如,假设您的项目中有res/drawable-mdpi/splash_bc.pngres/drawable-hdpi/splash_bc.pngres/drawable-xxhdpi/splash_bc.png。应该共享哪一个?¯\_(ツ)_/¯或者,如果splash_bc是矢量可绘制资源,共享图像的分辨率应该是多少?¯\_(ツ)_/¯
第四,您正在使用通配符MIME类型(intent.type = "image/*")。是提供内容的人--告诉收件人内容的MIME类型是您的工作。
最简单的解决方案是将图像写入一个文件(例如,getCacheDir()),使用FileProvider及其getUriForFile()方法获得一个可用的Uri到该文件,并将该Uri与共享逻辑一起使用。此外,由于您知道图像使用的是什么文件格式,因此使用它来驱动MIME类型。
This sample project(在this book中介绍)说明了使用FileProvider的基本技术。我的项目与您尝试完成的项目有一些不同:

  • 我要复制到文件的内容是一项资产,而不是可绘制资源
  • 我的内容是PDF,不是可绘制的
  • 我使用的是ACTION_VIEW,而不是ACTION_SEND

但是,它说明了将内容复制到缓存文件并使用FileProvider使其可用于其他应用程序的概念。

1sbrub3j

1sbrub3j2#

这个对它会起作用的

val uri = FileProvider.getUriForFile(context, AUTHORITY, "your file")
val intent = Intent(Intent.ACTION_SEND)
intent.type = "image/*"
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
intent.putExtra(Intent.EXTRA_STREAM, uri)

try {
    context.startActivity(Intent.createChooser(intent, ""))
} catch (ex: ActivityNotFoundException) {
    Toast.makeText(
        context,
        "Sorry, we cannot display this image!",
        Toast.LENGTH_LONG
    ).show()
}

相关问题