79

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

 5 years ago
source link: http://cjxgm.is-programmer.com/posts/214297.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前几天心血来潮打算升级一下我那老旧的 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 退出以后重启手机,问题解决。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK