Android从命令行读取最近的SMS消息


18

我最近损坏了Android屏幕。(再次)

它是T-Mobile G2

在不失去与所有人的联系的情况下,努力跟上我忙于技术相关的生活已经足够困难。

我已经扎好手机了,并且已经打开了USB调试功能。

有谁知道我将如何检查来自adb shell的最近SMS消息,以便在保存新手机或更换屏幕的同时继续工作。

感谢任何对此有任何信息的人。

编辑

对eldarerathis的回应

C:\android-sdk\platform-tools>adb shell
$ cd /data/data/com.android.providers.telephony/databases
cd /data/data/com.android.providers.telephony/databases
$ sqlite3 mmssms.db
sqlite3 mmssms.db
sqlite3: permission denied
$

无法chmod文件。你真的知道它在哪里吗?

$ chmod +x sqlite3
chmod +x sqlite3
Bad mode
$

苏只剩下基本命令

$ su
su
# cd /data/data/com.android.providers.telephony/databases
cd /data/data/com.android.providers.telephony/databases
# sqlite3 mmssms.db
sqlite3 mmssms.db
sqlite3: not found
#

已更正

未安装sqlite

C:\android-sdk\platform-tools>adb shell
$ cd /data/data/com.android.providers.telephony/databases
cd /data/data/com.android.providers.telephony/databases
$ sqlite3 mmssms.db
sqlite3 mmssms.db
SQLite version 3.6.22
Enter ".help" for instructions
sqlite>

另外,要访问数据库,我需要成为root用户。

C:\android-sdk\platform-tools>adb shell
$ su
# cd /data/data/com.android.providers.telephony/databases
cd /data/data/com.android.providers.telephony/databases
# sqlite3 mmssms.db
sqlite3 mmssms.db
SQLite version 3.6.22
Enter ".help" for instructions
sqlite>

非常感谢eldarerathis

此链接有帮助


看起来sqlite3您的设备上没有二进制文件。我的答案的第一个链接提供了帮助您将其安装到的说明/system/bin这是二进制文件本身的链接
eldarerathis

Answers:


10

这确实很丑陋,但是您可以通过使用sqlite3查看数据库条目的方式从命令行中读取它们。除非您安装了自定义ROM,否则可能需要为此挖掘一个二进制文件。在此Stack Overflow问题中,有一些安装上述二进制文件的说明,并且SuperOneClick附带了打包文件(可以在此处找到二进制文件的副本)。

如果确实需要安装二进制文件,请使用mount(不带参数)确定/system分区的物理位置(/dev/block/mtdblock3例如,mine是)。然后按照上面第一个链接中的说明进行操作,并使用以下命令以读/写方式重新安装它:

mount -o rw,remount /your/system/partition /system

拥有后,sqlite3您将需要打开一个adb shell,使用切换到root su,然后执行以下操作:

# cd /data/data
cd /data/data
# cd com.android.providers.telephony/databases ***
cd com.android.providers.telephony/databases
# sqlite3 mmssms.db
sqlite3 mmssms.db
SQLite version 3.7.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> SELECT * FROM sms WHERE read=0;

这将从表中拉出所有未读消息的所有行。表格中的列即已定义(因此您可以修整SELECT):

CREATE TABLE sms (_id INTEGER PRIMARY KEY,thread_id INTEGER,address TEXT,
  person INTEGER,date INTEGER,protocol INTEGER,read INTEGER DEFAULT 0,
  status INTEGER DEFAULT -1,type INTEGER,reply_path_present INTEGER,
  subject TEXT,body TEXT,service_center TEXT,locked INTEGER DEFAULT 0,
  error_code INTEGER DEFAULT 0,seen INTEGER DEFAULT 0);

***请注意标记的行:这可能会略有不同,具体取决于您的设备和Android版本,这就是为什么我cd单独包含此命令的原因。我认为它曾经com.android.providers/telephony/databases在较旧的设备上使用,但我不太记得。用于ls四处寻找正确的路径。


或者,您可以尝试将.db文件复制到SD卡上(或使用进行拉取adb pull),然后使用sqlite在计算机上读取该文件。


我尝试了这个,似乎sqlite3的权限被拒绝了

它说的是坏模式

@Jason:您需要是root用户才能读取该目录(只需su预先执行)。
eldarerathis

@Jason:嗯chmod 0755 sqlite3,那就用吧。也许chmod二进制股票不喜欢该+x参数。
eldarerathis

一旦我执行su。它就像有没有命令

3

多亏了eldarerathis的美丽提示,我才做

DB=/data/data/com.android.providers.telephony/databases/mmssms.db
echo 'select address,body from sms;' | ./sqlite3 -csv $DB 

从根提示符下读取我的SMS。

由于我没有sqlite3的,我首先要下载

curl http://dl.dropbox.com/u/16958605/sqlite3
chmod a+x sqlite3

或在Google Play上查看SQLite3安装程序(如果您不信任Dropbox源)。


1
该二进制文件的dl.dropbox.com URL并不安全。可以提供官方消息吗?
pzkpfw 2012年

1

如果你(作为感兴趣的不仅仅是发送者和消息的更多细节这个答案),我找到关于这一主题的好文章:读短信直接从Android的SQLite数据库。另请参见:消息数据结构

更好的是,请看一下Github:ANDROID-SMS是用Python编写的工具,可以恢复所有SMS消息并将其组织为带有提供统计信息的SMS对话。还会恢复所有MMS消息,并将它们与相应的文件组织到MMS对话中。我还没有尝试过它(几分钟前才发现),但是听起来很整洁。

当然,该程序不能直接在Android设备上运行-而是在您的计算机上运行(需要使用带有SQLite3 for Python的Python 2.7)。因此,您首先需要从设备中提取数据库。所有必需的步骤均在该项目的Github主页上进行了描述。


0

我发明的另一种解决方案是利用手机上的一个应用程序,该应用程序对SMS做出反应并将其保存到您可以使用ADB读取的文件中。

  • 安装任何类似Tasker的应用程序,我都是使用E-Robot完成的
  • 创建新命令
  • 新增活动 Contact=>SMS
  • 添加操作Memory=>Write file,您可以在其中每次将SMS保存到一个新文件,或使用分隔符将它保存到同一文件。无论如何,将其保存到/ sdcard或可通过ADB访问的任何路径。
  • 使用ADB监视该路径并读取SMS内容。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.