SmsManager.SendMultimediaMessage 不再适用于 ContentProvider

SmsManager.SendMultimediaMessage no longer works with ContentProvider

在 Xamarin.Android 中,我设置了一个自定义 ContentProvider,在发送 MMS 时向系统提供 PDU 文件:

[ContentProvider(new[] { Authority }, GrantUriPermissions = true)]
internal class MmsUploadContentProvider : ContentProvider
{
    internal const string Authority = "my.package.name.mmsUploads";

    public override ParcelFileDescriptor OpenFile(AndroidUri uri, string mode)
    {
        File uploadsDirectory = GetMmsUploadsDirectory(this.Context);
        File file = new File(uploadsDirectory, uri.LastPathSegment);
        ParcelFileDescriptor result = ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly);
        return result;
    }
}

我这样称呼SendMultimediaMessage

Uri contentProviderUri = Uri.Parse($"content://{MmsUploadContentProvider.Authority}/{pduFileName}");
smsManager.SendMultimediaMessage(this.Context, contentProviderUri, null, null, statusPendingIntent);

但是,当使用请求结果调用我的 BroadcastReceiver 时,它会收到一个 MMS_ERROR_IO_ERROR 结果代码。在文档中,它谈到了读取 PDU 的问题,所以我假设我的 ContentProvider 有问题。当我调试时,OpenFile 在我的 ContentProvider 中被调用,并且正确的 ParcelFileDescriptor 被返回就好了。

有人可以指出正确的方向来解决这个问题吗?几年前它曾经工作过,但 Android API 中一定发生了某些变化,导致它中断。

对于那些仍然感兴趣的人,最终的问题不是 ContentProvider。问题是发送的文件比 MMS 在这种情况下允许的文件稍大。这将抛出 MMS_ERROR_IO_ERROR.

我想出的解决办法是先看看MMS_CONFIG_MAX_MESSAGE_SIZE returned, and gradually compress any media files until the message size went under that limit. I have witnessed that that limit might be lower than the actual maximum size allowed to be sent: I was able to send messages larger than this limit at times. To be on the safe side, I still recommend compressing the MMS up to the limit specified by MMS_CONFIG_MAX_MESSAGE_SIZE到底是什么。