修复 LineageOS 能发送但是不能接收短信的问题 - 哆啦比猫的技术瞎扯 - Arch Linux · ドラえもん · 实时绘制
修复 LineageOS 能发送但是不能接收短信的问题
前几天心血来潮打算升级一下我那老旧的 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-2019.
本作品采用知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议进行许可。
文中凡未特殊声明且未声明为引用的代码均以 MIT 协议授权。