Android 在同一设备上使用IPC应用程序到应用程序通信传输图像

Android 在同一设备上使用IPC应用程序到应用程序通信传输图像,android,android-service,ipc,aidl,android-service-binding,Android,Android Service,Ipc,Aidl,Android Service Binding,我想知道是否有任何有效的方法使用IPC进行应用程序到应用程序的通信。我从文档中找到了使用AIDL的服务指南。但我真正想要的是在它们之间传输一个图像。(图像质量很高)唯一的问题是android只允许我们使用1024KB甚至更少的空间来通过捆绑包传递数据。如果您做的不止这些,您将以TransactionTooLargeException结束。现在我正在压缩图像,并在两个应用程序之间传递base64字符串,效果很好。但有时有些图像根本无法压缩。我怎么能做那样的事。我正在使用压缩图像 compress(

我想知道是否有任何有效的方法使用IPC进行应用程序到应用程序的通信。我从文档中找到了使用AIDL的服务指南。但我真正想要的是在它们之间传输一个图像。(图像质量很高)唯一的问题是android只允许我们使用1024KB甚至更少的空间来通过捆绑包传递数据。如果您做的不止这些,您将以TransactionTooLargeException结束。现在我正在压缩图像,并在两个应用程序之间传递base64字符串,效果很好。但有时有些图像根本无法压缩。我怎么能做那样的事。我正在使用压缩图像

compress(imageformat=webp,quality=90,compress.nowrap)

如果我得到TransactionTooLargeException,质量将降低10。关于如何在android上做类似的事情有什么想法吗

但问题是我不想打开任何其他应用程序。我正在接收的图像将被处理,并向从应用程序发送的图像发送状态。类似于“非常酷的图像”“非常糟糕的图像”。处于字符串状态

谢谢


iirc,android不允许进程间通信,但我可能错了。为此,您可能希望将数据分成多个块。这真的是两个应用程序吗,你用的是bundle…我觉得你好像在尝试进行互动交流。我已经用link更新了这个问题。请参阅。保存在GetFileDir()中,并使用FileProvider为您的文件提供服务。传输从文件的FileProvider获取的uri的uri.toString()。我不知道是否可以授予阅读权限,或者使用您自己的内容提供商。如果您只是在授权应用程序之间进行图像传输:或者
如果您只是在进行图像传输
,我们将其理解为
如果您只是在进行文件传输
@Morrison Chang
var quality = 100
    
    
    private fun sendImageToDevice(quality: Int, icon: Bitmap) {
        Log.e(TAG, "quality of image is $quality ")

        runOnUiThread {
            Toast.makeText(
                this@MainActivity,
                "Image Quality $quality",
                Toast.LENGTH_SHORT
            )
                .show()
        }



        if (quality > 0)
            try {
                mProcessImageService?.sendImageFormat(icon.toBase64(quality))
            } catch (e: TransactionTooLargeException) {
                e.message
                this.quality = quality - 20

                sendImageToDevice(this.quality, icon)
            }
        else {

        }
    }



fun Bitmap.toBase64(quality: Int): String {
    val outputStream = ByteArrayOutputStream()
    this.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)
    val base64String: String = Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP)
    Log.d("MainActivity", "outputstream size is ${outputStream.size()}")
    return base64String
}