修复 LineageOS 能发送但是不能接收短信的问题 - 哆啦比猫's Blog - I'm an ArchLinuxer

修复 LineageOS 能发送但是不能接收短信的问题

哆啦比猫 posted @ 2019年3月20日 17:53 in 杂项 with tags Android , 116 阅读

前几天心血来潮打算升级一下我那老旧的 CyanogenMod 13 的手机,经过一番折腾(CM13 → CM14.1 → LineageOS 14.1 experimental (for migration only) → LineageOS 14.1 nightly → LineageOS 16.0 nightly),终于在不丢数据的情况下完成了升级。今天因为需要短信验证码发现好像收不到短信,于是试试自己给自己发了个短信,果然收不到。

于是给自己的另一个号码发短信,发现另一个号码能收到。把卡拿出来换到另一台手机里会收到之前发给自己的短信。遂可判断不是网络问题。那就一定是手机设置的问题了。于是把卡放回到有问题的手机,再次给自己发短信确认收不到,这样也可以判断这不是“重启一下”就能解决的问题。当然了,恢复出厂设置、清数据重新刷机什么的是不可能的,丢数据的操作是绝对不可能做的。在此前提下尝试了网上各种偏方均无效,那就只能……

熟练地打开了 adb logcat (我的手机平时也用作开发,一直都开着开发者模式),手机上操作给自己发了条短信,于是出现了

SmsProvider: insert: failed!

What? 往上翻就是一堆 stacktrace,还有一个 SQLiteDatabase Error 说是 table raw has no column display_originating_addr。(你问我为什么不直接把错误贴出来?我要是保存了我会不贴出来?)

一番搜索没有人讨论过相关的问题,只找到了 SmsProvider 的源代码……那就只能自力更生了。沿着 insert: failed! 这条错误消息,追查到 MmsSmsDatabaseHelper.java,里面有各种 SQL 查询的语句、创建数据库的代码、升级迁移的代码、以及数!据!库!文!件!名!这个文件叫 mmssms.db(MMS = 彩信,SMS = 短信),但是路径呢?路径呢?径呢?呢?

算了,自己找找吧。

$ adb shell
A0001:/ $ su
A0001:/ # find . -name 'mmssms.db'
...省略一堆来自 /proc 的错误...
/data/user_de/0/com.android.providers.telephony/databases/mmssms.db

看样子是它了。

A0001:/ # sqlite3 /data/user_de/0/com.android.providers.telephony/databases/mmssms.db
sqlite> .tables
addr                 pdu_restricted       threads
android_metadata     pending_msgs         words
attachments          rate                 words_content
canonical_addresses  raw                  words_segdir
drm                  sms                  words_segments
part                 sms_restricted
pdu                  sr_pending
sqlite> .schema raw
CREATE TABLE raw (
    _id INTEGER PRIMARY KEY,
    date INTEGER,
    reference_number INTEGER,
    count INTEGER,
    sequence INTEGER,
    destination_port INTEGER,
    address TEXT,
    sub_id INTEGER DEFAULT -1,
    phone_id INTEGER DEFAULT -1,
    pdu TEXT,
    deleted INTEGER DEFAULT 0,
    message_body TEXT
);

没错,是它,raw 表确实没有 display_originating_addr。就是它。

那就好说了。

sqlite> ALTER TABLE raw ADD COLUMN display_originating_addr TEXT;

CTRL-D 退出以后重启手机,问题解决。


凡未特殊声明(转载/翻译),所有文章均为原创。
by Giumo Xavier Clanjor (哆啦比猫/兰威举), 2010, 2011, 2012, 2013, 2014, 2015-2016 and 2017.
知识共享许可协议本作品采用知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议进行许可。
文中凡未特殊声明且未声明为引用的代码均以 MIT 协议授权。

blog comments powered by Disqus
© 2010, 2011, 2012, 2013, 2014, 2015-2016 and 2017 Giumo Xavier Clanjor (哆啦比猫/兰威举).
© 2013, 2014, 2015-2016 and 2017 The Dark Colorscheme Designed by Giumo Xavier Clanjor (哆啦比猫/兰威举).
知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议
| © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee