QClipboard调用setMimeData在Android平台自定义MIME类型复制失败问题
问题根因
Android系统原生剪贴板服务ClipboardManager仅默认保留系统预定义的标准MIME类型数据,自定义非标准MIME类型(如你使用的com.myapp.filesystem.myclient.wifi)会被系统自动过滤丢弃,因此存入剪贴板后读取返回空值。iOS系统无该限制,因此表现正常。
你代码中setMimeData前打印的自定义MIME值正常,存入后读取为空,正是因为Qt Android底层调用系统剪贴板时该字段被系统过滤导致。
可行解决方案
你可以从以下两种方案中选一种适配Android端:
方案1:使用Android认可的通用二进制MIME类型存储自定义数据
将自定义数据存入系统不会过滤的application/octet-stream通用二进制类型,同时可以额外加个标识头区分你的业务数据,避免和其他应用的二进制剪贴内容冲突:
void FileSystemGlobals::copyUris(const FileSystemID &fromFileSystemID, const QStringList &uris) { auto data = mimeData(fromFileSystemID, uris).toMap(); auto mime = new QMimeData(); QByteArray customData; // 存储自定义MIME的键值对,避免丢数据 for (auto i = data.constBegin(); i != data.constEnd(); i++) { QByteArray bArray = i.value().toByteArray(); QString key = i.key(); // Android端特殊处理自定义MIME #ifdef Q_OS_ANDROID if (key == "com.myapp.filesystem.myclient.wifi") { // 把自定义键值拼到通用二进制类型里,加标识头区分 customData.append("MYAPP_MIME_HEADER||" + key.toUtf8() + "||" + bArray.toBase64() + "||END"); continue; } #endif mime->setData(key, bArray); } #ifdef Q_OS_ANDROID if (!customData.isEmpty()) { mime->setData("application/octet-stream", customData); } #endif qDebug() << mime->data("com.myapp.filesystem.myclient.wifi"); p->clipboard->setMimeData(mime); // 读取的时候做对应解析即可 const QMimeData *mime1 = p->clipboard->mimeData(); #ifdef Q_OS_ANDROID QByteArray androidCustomData = mime1->data("application/octet-stream"); if (androidCustomData.startsWith("MYAPP_MIME_HEADER||")) { // 拆分解析出自定义MIME的值即可 QByteArrayList parts = androidCustomData.split('||'); if (parts.size() >=3 && parts[1] == "com.myapp.filesystem.myclient.wifi") { QByteArray customValue = QByteArray::fromBase64(parts[2]); qDebug() << "自定义MIME值:" << customValue; } } #else qDebug() << "mime1" << mime1->data("com.myapp.filesystem.myclient.wifi"); #endif qDebug() << "mime1" << mime1->data("text/plain"); qDebug() << "mime1" << mime1->data("uri-list"); }
方案2:给自定义MIME添加vnd前缀
Android要求自定义厂商MIME类型必须添加vnd.前缀才会被系统识别保留,你可以把自定义MIME键修改为vnd.com.myapp.filesystem.myclient.wifi,两端统一适配该键即可,无需额外解析逻辑。
内容的提问来源于stack exchange,提问作者willy
相关产品推荐
相关产品推荐

