V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
stevenkang
V2EX  ›  Android

Android 新手,求助如何读取短信内容

  •  
  •   stevenkang · 2019-08-26 09:41:08 +08:00 · 16174 次点击
    这是一个创建于 1920 天前的主题,其中的信息可能已经有所发展或是发生改变。

    备用手机是 yunos 3.2,Android 5.1,双卡,卡槽 2 插了一张联通的卡,现在不用联通的卡了,但绑定了很多 app 平时需要接受短信。

    于是想在备用手机上安装一个能转发短信内容的 app,寻找了一番之后试了几款 app (绿芽短信转发),但是效果都不理想(无法转发或者转发太慢)。

    现在想自己开发一个 app,阅读了 Android 官方开发文档后,算是简单的入门,可以写一些简单的功能。在网上找到了读取短信内容的方法:通过读取 “ content://sms/inbox ” 数据内容来查询短信,并且给了“ SMS_READ ”权限,编写代码检查权限也是 OK 的,但是读取短信内容显示 count 为 0.

    这是因为是双卡的并且电话卡在卡槽 2 的问题吗?还是因为 yunos 的禁止了读取短信内容权限。

    (抱歉没有截图,这会儿代码没在公司电脑上)

    23 条回复    2020-03-03 23:32:25 +08:00
    janus77
        1
    janus77  
       2019-08-26 09:46:11 +08:00
    tasker
    richard1122
        2
    richard1122  
       2019-08-26 09:52:41 +08:00
    ifttt
    stevenkang
        3
    stevenkang  
    OP
       2019-08-26 10:29:34 +08:00
    @janus77
    @richard1122
    安装不了梯子,这两个不用梯子可以正常使用吗。也装不了 gms
    theoran
        4
    theoran  
       2019-08-26 10:34:04 +08:00
    有些厂商会默认禁止读取短信,yunos 不清楚,类似 miui 需要自己在开发者选项里开启才行
    axlecho
        5
    axlecho  
       2019-08-26 13:23:55 +08:00 via Android
    跟手机卡没关系 你要是怀疑手机卡的问题 拔掉手机卡试试

    不过记得了很早以前手机卡能存短信那种形式用 Api 应该是获取不到的
    arrow8899
        6
    arrow8899  
       2019-08-26 13:47:18 +08:00
    Kzhii
        7
    Kzhii  
       2019-08-26 14:25:50 +08:00
    Uiautomator 了解一下
    siknet
        8
    siknet  
       2019-08-26 14:32:45 +08:00 via Android
    有个 APP 叫备用机,你可以试试
    wulu
        9
    wulu  
       2019-08-26 14:46:57 +08:00 via Android
    ifttt
    shily
        10
    shily  
       2019-08-26 17:37:37 +08:00 via Android
    卡槽 2 的原因吧,那个时代双卡的支持不是很好,都是魔改支持双卡的,但 app 层面没有 API 访问卡 2。
    iRiven
        11
    iRiven  
       2019-08-26 17:57:36 +08:00
    我也想做这个软件 楼主有联系方式吗
    wujl100
        12
    wujl100  
       2019-08-26 18:20:59 +08:00
    正好手边有,给你一段代码参考下:
    try{
    ContentResolver cr = this.getApplicationContext().getContentResolver();
    String[] projection = new String[]{"_id", "address", "person", "body", "date", "type"};

    Uri uri = Uri.parse("content://sms/inbox");
    Cursor cur = cr.query(uri, projection, null, null, "date desc");

    if (cur.moveToFirst()) {
    String name;
    String phoneNumber;
    String smsbody;
    String date;

    int nameColumn = cur.getColumnIndex("person");
    int phoneNumberColumn = cur.getColumnIndex("address");
    int smsbodyColumn = cur.getColumnIndex("body");
    int dateColumn = cur.getColumnIndex("date");

    do{
    name = cur.getString(nameColumn);
    phoneNumber = cur.getString(phoneNumberColumn);
    smsbody = cur.getString(smsbodyColumn);
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Date d = new Date(Long.parseLong(cur.getString(dateColumn)));
    date = dateFormat.format(d);

    }while(cur.moveToNext());
    }
    } catch(SQLiteException ex) {
    Log.d("SQLiteException in getSmsInPhone", ex.getMessage());
    }
    winterbells
        13
    winterbells  
       2019-08-26 18:33:10 +08:00 via Android
    我也自己写了个,读取短信太麻烦。用 tasker 将短信发到 app,app 发邮件到邮箱
    cz21ok
        14
    cz21ok  
       2019-08-26 18:52:27 +08:00
    只接收新短信并转发的话,可以用 BroadcastReceiver, 前几天刚给测试做了个转发验证码到钉钉 bot 的 app,正好有代码可以参考下:
    ~~~
    override fun onReceive(context: Context?, intent: Intent?) {
    if(intent?.action.equals("android.provider.Telephony.SMS_RECEIVED")) {
    val bundle = intent!!.extras
    val pdus = bundle.get("pdus") as Array<Any>
    if (pdus.isEmpty()) {
    return
    }
    val messages = arrayOfNulls<SmsMessage>(pdus.size)
    val sb = StringBuilder()
    for (i in pdus.indices) {
    messages[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
    sb.append(messages[i]?.messageBody)
    }
    val messageText = sb.toString()
    //可以用正则做一些过滤处理
    send(messageText)
    }
    }
    ~~~
    fun send(string: String) 自己实现,可以做个 tg bot 之类的
    cz21ok
        15
    cz21ok  
       2019-08-26 18:58:12 +08:00
    国内定制 ROM 是有一些坑,测试机某米动态申请权限返回 granted, 但 系统-应用-权限 里发现并没有授权。
    demo06
        16
    demo06  
       2019-08-27 09:40:07 +08:00
    12 楼正解,用 ContentProvider
    stevenkang
        17
    stevenkang  
    OP
       2019-08-27 13:44:39 +08:00
    @wulu
    @richard1122
    下载安装了 ifttt,发现无法邮件通知成功,不知道是否是系统限制的问题。


    @wujl100 这种方式试了很多次,依然读取不到。奇怪的是我下载别的软件(例如:QQ 同步助手)都能读取到历史短信,真不知道他们是用的哪种方式。


    @cz21ok 申请权限 OK,代码调用时检测权限 OK、系统-应用-权限设置 OK,内置的安装软件里面都检测了权限没问题,就是读取不到内容。这种定制 rom 太坑爹了,相关的文档都不好找。
    wujl100
        18
    wujl100  
       2019-08-27 15:30:46 +08:00
    @stevenkang <uses-permission android:name="android.permission.READ_SMS"/> 读取短信的权限加了么?
    PerFectTime
        19
    PerFectTime  
       2019-08-28 15:03:49 +08:00
    目前用的 Tasker 转发到 Telegram 方案,基本上延时 20s 以内,用着还不错,就是需要自建一个 Telegram API 的反代。

    代码如下(别喷我...):
    https://gist.github.com/IcedMango/6007aed2d52872a43ef9986475f392df

    效果如下:
    stevenkang
        20
    stevenkang  
    OP
       2019-08-31 12:34:01 +08:00
    @wujl100 AndroidManifest.xml 里面加了这个权限的,通过 takePersistableUriPermission 授权也不行

    @PerFectTime Tasker 配置好了收到短信、通知触发推送,完全没反应,手动测试推送是没有问题的

    国产的 os 太 J8 坑比了
    PerFectTime
        21
    PerFectTime  
       2019-08-31 16:06:16 +08:00
    @stevenkang #20 白名单检查一下?
    ludan7h
        22
    ludan7h  
       2020-03-03 23:30:01 +08:00   ❤️ 1
    @PerFectTime 大佬,不用代码,仅使用 tasker 内置的功能,可以实现时间显示由 “11.44”→“11:44”的转化吗?
    不知道软件作者为什么使用“11.44”这种奇怪的时间显示格式……
    PerFectTime
        23
    PerFectTime  
       2020-03-03 23:32:25 +08:00
    @ludan7h #22 我就是烦这个点就把他替换了,貌似只能用代码解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4435 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:13 · PVG 18:13 · LAX 02:13 · JFK 05:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.