Глюк c SMS в Android

Случился у меня на андроиде глюк с смс. Пришло новое сообщение, но его невозможно открыть для прочтения. В списке его нет. На конвертике показывает, что есть непрочитанное сообщение, а также в шторке с уведомлениями. При попытке отрыть смску из шторки – открывается окошко для создания нового сообщения. Пришлось заняться лечением 🙂

Если столкнулись с подобной проблемой, прошу под кат.

Конвертик с уведомлением
Конвертик с уведомлением
Шторка с уведомлением
Шторка с уведомлением
Окно создания нового сообщения вместо отображения смс
Окно создания нового сообщения вместо отображения смс
В списке смс нет нового сообщения
В списке смс нет нового сообщения

Возможно для решения проблемы есть какие-то программки, но мне было лень искать. Тем более, смартфон у меня рутированный, стоит Root Explorer и SQLite Manager. Их я и заюзал.

База данных с смс находится по пути:
/data/data/com.android.providers.telephony/databases/mmssms.db

Базы Данных com.android.providers.telephony
Базы Данных com.android.providers.telephony

Копируем куда-то на SD-карточку данную БД и открываем на редактирование в SQLite Manager.

БД mmssms.db
БД mmssms.db

В таблице sms хранятся собственно сами сообщения.

Таблица sms
Таблица sms

Находим глючное сообщение. У меня это смс с _id равным 4480 и thread_id равным 86.

В андроиде смс сами по себе не существуют, для них создается переписка. Каждая смс принадлежит той или иной переписке, например, моя глючная принадлежит к переписке с айдишником равным 86.

Открываем таблицу с переписками – это таблица threads.

Таблица threads
Таблица threads

И, о чудо, нет переписки с айдишником 86! По какой-то причине произошел сбой и в данную таблицу не была добавлена переписка, или была удалена.

И так… можно просто удалить глючную запись с таблицы sms. После чего сохранить изменения, и файл БД mmssms.db скопировать обратно в /data/data/com.android.providers.telephony/databases/
Проставить права на файл rw-rw—-
Ребутнуться.
Но это скучно… не интересно…

Более интересный вариант, создать переписку. В таблицу threads вставляем запись с _id=86. Главное заполнить поля _id, date, message_count и recipient_ids.

  • В date пишем количество секунд прошедшее с 00:00:00 UTC 1 января, 1970 года до даты прихода смс.
  • В message_count количество смс в переписке, в моем случае 1.
  • В recipient_ids записываются айдишники участвующих в переписке. Посмотреть айдишники можно в таблице canonical_addresses. В моем случае это _id = 178.
Таблица canonical_addresses
Таблица canonical_addresses

Остальные поля я забил нулями.

Таблица threads с вставленной записью
Таблица threads с вставленной записью

После всех этих манипуляций копируем обратно файл базы.
Не забываем проставить права: rw-rw—-

Для того чтобы изменения вступили в силу надо перезагрузить смартфон.

Утерянная смс
Утерянная смс

Чудо Господне, смс появилась! 🙂

UPD: Решение проблемы с глючной смс без root