Глюк c SMS в Android

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

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


Конвертик с уведомлением

Шторка с уведомлением

Окно создания нового сообщения вместо отображения смс

В списке смс нет нового сообщения

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

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

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

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

БД mmssms.db

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

Таблица sms

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

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

Открываем таблицу с переписками - это таблица 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

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

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

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

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

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

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