添加org和title字段后Segno生成的vCard二维码致拨号器崩溃
解决segno生成带ORG/TITLE的vCard二维码导致Dialer崩溃的问题
我之前碰到过类似的情况,手机通讯录应用(Dialer)对vCard格式的兼容性要求很严格,尤其是ORG和TITLE字段的格式稍有不符合标准就会触发崩溃。咱们一步步来解决:
1. 先排查segno生成的vCard原始内容
首先,先看看segno到底生成了什么样的vCard文本,这能帮我们定位问题:
from segno import helpers # 生成vCard二维码对象 qr=helpers.make_vcard(name='surname;name', displayname='Name Surname', org='Place of work', title='Position', phone=('71******', '77******'),email=('******@gmail.com'), url=['http://********.com'], pobox='PO Box ***********', city='G*****') # 打印原始vCard内容 print(qr.to_str())
检查输出的vCard中,ORG:和TITLE:字段是否符合vCard 3.0标准(大多数安卓手机对3.0的兼容性最好),有没有多余的符号或者格式错误。
2. 方案一:手动构建标准vCard内容
如果segno的自动生成存在格式问题,咱们直接手动写符合标准的vCard字符串,再生成二维码,这样完全可控:
from segno import make from PIL import Image # 严格按照vCard 3.0标准编写内容 vcard = """BEGIN:VCARD VERSION:3.0 FN:Name Surname N:surname;name;;; ORG:Place of work TITLE:Position TEL;TYPE=CELL:71****** TEL;TYPE=CELL:77****** EMAIL;TYPE=INTERNET:******@gmail.com URL:http://********.com ADR;TYPE=POSTAL:;;PO Box ***********;G*****;;;; END:VCARD""" # 生成二维码 qr = make(vcard) qr.save('person.png', scale=15, background='white', color='black')
这个版本的vCard完全遵循3.0规范,手机Dialer能正确解析所有字段,包括ORG和TITLE。
3. 方案二:指定vCard版本(简化版)
如果不想手动写vCard,也可以尝试在make_vcard里指定兼容的版本号,强制生成vCard 3.0格式:
from segno import helpers from PIL import Image qr=helpers.make_vcard( name='surname;name', displayname='Name Surname', org='Place of work', title='Position', phone=('71******', '77******'), email=('******@gmail.com'), url=['http://********.com'], pobox='PO Box ***********', city='G*****', version='3.0' # 强制使用vCard 3.0,避免默认的4.0兼容性问题 ) qr.save('person.png', scale=15, background='white', color='black')
很多安卓手机的通讯录应用对vCard 4.0的支持不够完善,指定3.0版本大概率能解决崩溃问题。
验证方法
生成二维码后,用手机扫描:
- 先查看二维码解析出的vCard内容是否完整显示ORG和TITLE
- 再尝试添加到联系人,确认Dialer不会崩溃,所有字段都能正确填充
内容的提问来源于stack exchange,提问作者Percy Godiraone Leburu
相关产品推荐
相关产品推荐

